1
0
Fork 0

Merging upstream version 26.28.1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-06-15 10:36:04 +02:00
parent 893214206a
commit c79efa667c
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
96 changed files with 58442 additions and 56422 deletions

View file

@ -1,6 +1,92 @@
Changelog
=========
## [v26.27.0] - 2025-06-12
### :boom: BREAKING CHANGES
- due to [`ac6555b`](https://github.com/tobymao/sqlglot/commit/ac6555b4d6c162ef7b14b63307d01fd560138ea0) - preserve DIV binary operator, fixes [#5198](https://github.com/tobymao/sqlglot/pull/5198) *(PR [#5199](https://github.com/tobymao/sqlglot/pull/5199) by [@georgesittas](https://github.com/georgesittas))*:
preserve DIV binary operator, fixes #5198 (#5199)
- due to [`dfdd84b`](https://github.com/tobymao/sqlglot/commit/dfdd84bbc50da70f40a17b39935f8171d961f7d2) - CTEs instead of subqueries for pipe syntax *(PR [#5205](https://github.com/tobymao/sqlglot/pull/5205) by [@geooo109](https://github.com/geooo109))*:
CTEs instead of subqueries for pipe syntax (#5205)
- due to [`5f95299`](https://github.com/tobymao/sqlglot/commit/5f9529940d83e89704f7d25eda63cd73fdb503ae) - support multi-part (>3) dotted functions *(PR [#5211](https://github.com/tobymao/sqlglot/pull/5211) by [@georgesittas](https://github.com/georgesittas))*:
support multi-part (>3) dotted functions (#5211)
- due to [`02afa2a`](https://github.com/tobymao/sqlglot/commit/02afa2a1941fc67086d50dffac2857262f1c3c4f) - Preserve quoting for UDT *(PR [#5216](https://github.com/tobymao/sqlglot/pull/5216) by [@VaggelisD](https://github.com/VaggelisD))*:
Preserve quoting for UDT (#5216)
### :sparkles: New Features
- [`c20f85e`](https://github.com/tobymao/sqlglot/commit/c20f85e3e171e502fc51f74894d3313f0ad61535) - **spark**: support ALTER ADD PARTITION *(PR [#5208](https://github.com/tobymao/sqlglot/pull/5208) by [@georgesittas](https://github.com/georgesittas))*
- :arrow_lower_right: *addresses issue [#5204](https://github.com/tobymao/sqlglot/issues/5204) opened by [@cosinequanon](https://github.com/cosinequanon)*
### :bug: Bug Fixes
- [`99bbae3`](https://github.com/tobymao/sqlglot/commit/99bbae370329c5f5cd132b711c714359cf96ba58) - **sqlite**: allow ALTER RENAME without COLUMN keyword fixes [#5195](https://github.com/tobymao/sqlglot/pull/5195) *(commit by [@georgesittas](https://github.com/georgesittas))*
- [`ac6555b`](https://github.com/tobymao/sqlglot/commit/ac6555b4d6c162ef7b14b63307d01fd560138ea0) - **hive**: preserve DIV binary operator, fixes [#5198](https://github.com/tobymao/sqlglot/pull/5198) *(PR [#5199](https://github.com/tobymao/sqlglot/pull/5199) by [@georgesittas](https://github.com/georgesittas))*
- [`d0eeb26`](https://github.com/tobymao/sqlglot/commit/d0eeb2639e771e8f8b6feabd41c65f16ed5a9829) - eliminate_join_marks has multiple issues fixes [#5188](https://github.com/tobymao/sqlglot/pull/5188) *(PR [#5189](https://github.com/tobymao/sqlglot/pull/5189) by [@snovik75](https://github.com/snovik75))*
- :arrow_lower_right: *fixes issue [#5188](https://github.com/tobymao/sqlglot/issues/5188) opened by [@snovik75](https://github.com/snovik75)*
- [`dfdd84b`](https://github.com/tobymao/sqlglot/commit/dfdd84bbc50da70f40a17b39935f8171d961f7d2) - **parser**: CTEs instead of subqueries for pipe syntax *(PR [#5205](https://github.com/tobymao/sqlglot/pull/5205) by [@geooo109](https://github.com/geooo109))*
- [`77e9d9a`](https://github.com/tobymao/sqlglot/commit/77e9d9a0269e2013379967cf2f46fbd79c036277) - **mysql**: properly parse STORED/VIRTUAL computed columns *(PR [#5210](https://github.com/tobymao/sqlglot/pull/5210) by [@georgesittas](https://github.com/georgesittas))*
- :arrow_lower_right: *fixes issue [#5203](https://github.com/tobymao/sqlglot/issues/5203) opened by [@mdebski](https://github.com/mdebski)*
- [`5f95299`](https://github.com/tobymao/sqlglot/commit/5f9529940d83e89704f7d25eda63cd73fdb503ae) - **parser**: support multi-part (>3) dotted functions *(PR [#5211](https://github.com/tobymao/sqlglot/pull/5211) by [@georgesittas](https://github.com/georgesittas))*
- :arrow_lower_right: *fixes issue [#5200](https://github.com/tobymao/sqlglot/issues/5200) opened by [@mateuszpoleski](https://github.com/mateuszpoleski)*
- [`02afa2a`](https://github.com/tobymao/sqlglot/commit/02afa2a1941fc67086d50dffac2857262f1c3c4f) - **postgres**: Preserve quoting for UDT *(PR [#5216](https://github.com/tobymao/sqlglot/pull/5216) by [@VaggelisD](https://github.com/VaggelisD))*
- :arrow_lower_right: *fixes issue [#5212](https://github.com/tobymao/sqlglot/issues/5212) opened by [@NickCrews](https://github.com/NickCrews)*
- [`f37c0b1`](https://github.com/tobymao/sqlglot/commit/f37c0b1197321dd610648ce652a171ab063deeeb) - **snowflake**: ensure a standalone GET() expression can be parsed *(PR [#5219](https://github.com/tobymao/sqlglot/pull/5219) by [@georgesittas](https://github.com/georgesittas))*
### :wrench: Chores
- [`ad8a4e7`](https://github.com/tobymao/sqlglot/commit/ad8a4e73e1a9e4234f0b711163fb49630acf736c) - refactor join mark elimination to use is_correlated_subquery *(commit by [@georgesittas](https://github.com/georgesittas))*
## [v26.26.0] - 2025-06-09
### :boom: BREAKING CHANGES
- due to [`434c45b`](https://github.com/tobymao/sqlglot/commit/434c45b547c3a5ea155dc8d7da2baab326eb6d4f) - improve support for ENDSWITH closes [#5170](https://github.com/tobymao/sqlglot/pull/5170) *(commit by [@georgesittas](https://github.com/georgesittas))*:
improve support for ENDSWITH closes #5170
- due to [`bc001ce`](https://github.com/tobymao/sqlglot/commit/bc001cef4c907d8fa421d3190b4fa91865d9ff6c) - Add support for ANY_VALUE for versions 16+ *(PR [#5179](https://github.com/tobymao/sqlglot/pull/5179) by [@VaggelisD](https://github.com/VaggelisD))*:
Add support for ANY_VALUE for versions 16+ (#5179)
- due to [`6a2cb39`](https://github.com/tobymao/sqlglot/commit/6a2cb39d0ceec091dc4fc228f26d4f457729a3cf) - virtual column with AS(expr) as ComputedColumnConstraint *(PR [#5180](https://github.com/tobymao/sqlglot/pull/5180) by [@geooo109](https://github.com/geooo109))*:
virtual column with AS(expr) as ComputedColumnConstraint (#5180)
- due to [`29e2f1d`](https://github.com/tobymao/sqlglot/commit/29e2f1d89c095c9fab0944a6962c99bd745c2c91) - Array_intersection transpilation support *(PR [#5186](https://github.com/tobymao/sqlglot/pull/5186) by [@HarishRavi96](https://github.com/HarishRavi96))*:
Array_intersection transpilation support (#5186)
### :sparkles: New Features
- [`434c45b`](https://github.com/tobymao/sqlglot/commit/434c45b547c3a5ea155dc8d7da2baab326eb6d4f) - improve support for ENDSWITH closes [#5170](https://github.com/tobymao/sqlglot/pull/5170) *(commit by [@georgesittas](https://github.com/georgesittas))*
- [`63f9cb4`](https://github.com/tobymao/sqlglot/commit/63f9cb4b158b88574136b32241ee60254352c9e6) - **sqlglotrs**: match the Python implementation of __repr__ for tokens *(PR [#5172](https://github.com/tobymao/sqlglot/pull/5172) by [@georgesittas](https://github.com/georgesittas))*
- [`c007afa`](https://github.com/tobymao/sqlglot/commit/c007afa23831e9bd86f401d85260e15edf00328f) - support Star instance as first arg of exp.column helper *(PR [#5177](https://github.com/tobymao/sqlglot/pull/5177) by [@georgesittas](https://github.com/georgesittas))*
- [`bc001ce`](https://github.com/tobymao/sqlglot/commit/bc001cef4c907d8fa421d3190b4fa91865d9ff6c) - **postgres**: Add support for ANY_VALUE for versions 16+ *(PR [#5179](https://github.com/tobymao/sqlglot/pull/5179) by [@VaggelisD](https://github.com/VaggelisD))*
- :arrow_lower_right: *addresses issue [#4674](https://github.com/TobikoData/sqlmesh/issues/4674) opened by [@petrikoro](https://github.com/petrikoro)*
- [`ba05ff6`](https://github.com/tobymao/sqlglot/commit/ba05ff67127e056d567fc2c1d3bcc8e3dcce7b7e) - **parser**: AGGREGATE with GROUP AND ORDER BY pipe syntax *(PR [#5171](https://github.com/tobymao/sqlglot/pull/5171) by [@geooo109](https://github.com/geooo109))*
- [`26077a4`](https://github.com/tobymao/sqlglot/commit/26077a47d9db750f44ab1baf9a434596b5bb613b) - make to_table more lenient *(PR [#5183](https://github.com/tobymao/sqlglot/pull/5183) by [@georgesittas](https://github.com/georgesittas))*
- [`29e2f1d`](https://github.com/tobymao/sqlglot/commit/29e2f1d89c095c9fab0944a6962c99bd745c2c91) - Array_intersection transpilation support *(PR [#5186](https://github.com/tobymao/sqlglot/pull/5186) by [@HarishRavi96](https://github.com/HarishRavi96))*
- [`d86a114`](https://github.com/tobymao/sqlglot/commit/d86a1147aeb866ed0ab2c342914ecf8cbfadac8a) - **sqlite**: implement RESPECT/IGNORE NULLS in first_value() *(PR [#5185](https://github.com/tobymao/sqlglot/pull/5185) by [@NickCrews](https://github.com/NickCrews))*
- [`1d50fca`](https://github.com/tobymao/sqlglot/commit/1d50fca8ffc34e4acbc1b791c4cdf5f184a748db) - improve transpilation of st_point and st_distance *(PR [#5194](https://github.com/tobymao/sqlglot/pull/5194) by [@georgesittas](https://github.com/georgesittas))*
- [`756ec3b`](https://github.com/tobymao/sqlglot/commit/756ec3b65db1eb2572d017a3ac12ece6bb44c726) - **parser**: SET OPERATORS with pipe syntax *(PR [#5184](https://github.com/tobymao/sqlglot/pull/5184) by [@geooo109](https://github.com/geooo109))*
### :bug: Bug Fixes
- [`6a2cb39`](https://github.com/tobymao/sqlglot/commit/6a2cb39d0ceec091dc4fc228f26d4f457729a3cf) - **parser**: virtual column with AS(expr) as ComputedColumnConstraint *(PR [#5180](https://github.com/tobymao/sqlglot/pull/5180) by [@geooo109](https://github.com/geooo109))*
- :arrow_lower_right: *fixes issue [#5173](https://github.com/tobymao/sqlglot/issues/5173) opened by [@suyah](https://github.com/suyah)*
- [`c87ae02`](https://github.com/tobymao/sqlglot/commit/c87ae02aa263be8463ca7283ebd090385a4bfd59) - **sqlite**: Add REPLACE to command tokens *(PR [#5192](https://github.com/tobymao/sqlglot/pull/5192) by [@VaggelisD](https://github.com/VaggelisD))*
- :arrow_lower_right: *fixes issue [#5187](https://github.com/tobymao/sqlglot/issues/5187) opened by [@stefanmalanik](https://github.com/stefanmalanik)*
- [`4b89afd`](https://github.com/tobymao/sqlglot/commit/4b89afdcc0063e70cbc64165c7f1f5102afaa87c) - **starrocks**: array_agg_transpilation_fix *(PR [#5190](https://github.com/tobymao/sqlglot/pull/5190) by [@Swathiraj23](https://github.com/Swathiraj23))*
- [`461b054`](https://github.com/tobymao/sqlglot/commit/461b0548832ab8d916c3a6638f27a49f681109fe) - **postgres**: support use_spheroid argument in ST_DISTANCE *(commit by [@georgesittas](https://github.com/georgesittas))*
### :wrench: Chores
- [`83de4e1`](https://github.com/tobymao/sqlglot/commit/83de4e11bc1547aa22b275b20c0326dfbe43b2b8) - improve benchmark result displaying *(PR [#5176](https://github.com/tobymao/sqlglot/pull/5176) by [@georgesittas](https://github.com/georgesittas))*
- [`5d5dc2f`](https://github.com/tobymao/sqlglot/commit/5d5dc2fa471bd53730e03ac8039804221949f843) - Clean up exp.ArrayIntersect PR *(PR [#5193](https://github.com/tobymao/sqlglot/pull/5193) by [@VaggelisD](https://github.com/VaggelisD))*
## [v26.25.3] - 2025-06-04
### :sparkles: New Features
- [`964b4a1`](https://github.com/tobymao/sqlglot/commit/964b4a1e367e00e243b80edf677cd48d453ed31e) - add line/col position for Star *(commit by [@georgesittas](https://github.com/georgesittas))*
@ -4794,3 +4880,5 @@ Changelog
[v26.25.1]: https://github.com/tobymao/sqlglot/compare/v26.25.0...v26.25.1
[v26.25.2]: https://github.com/tobymao/sqlglot/compare/v26.25.1...v26.25.2
[v26.25.3]: https://github.com/tobymao/sqlglot/compare/v26.25.2...v26.25.3
[v26.26.0]: https://github.com/tobymao/sqlglot/compare/v26.25.3...v26.26.0
[v26.27.0]: https://github.com/tobymao/sqlglot/compare/v26.26.0...v26.27.0

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -632,6 +632,7 @@
<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/dlt-hub/dlt">dlt</a></li>
<li><a href="https://github.com/kelsin/mysql-mimic">mysql-mimic</a></li>
<li><a href="https://github.com/pinterest/querybook">Querybook</a></li>
<li><a href="https://github.com/marsupialtail/quokka">Quokka</a></li>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot._typing API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot._version API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -84,8 +84,8 @@
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">&#39;26.25.3&#39;</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</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">26</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">&#39;26.28.0&#39;</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</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">26</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></pre></div>
@ -93,7 +93,7 @@
<section id="__version__">
<div class="attr variable">
<span class="name">__version__</span><span class="annotation">: str</span> =
<span class="default_value">&#39;26.25.3&#39;</span>
<span class="default_value">&#39;26.28.0&#39;</span>
</div>
@ -105,7 +105,7 @@
<section id="__version_tuple__">
<div class="attr variable">
<span class="name">__version_tuple__</span><span class="annotation">: object</span> =
<span class="default_value">(26, 25, 3)</span>
<span class="default_value">(26, 28, 0)</span>
</div>
@ -117,7 +117,7 @@
<section id="version">
<div class="attr variable">
<span class="name">version</span><span class="annotation">: str</span> =
<span class="default_value">&#39;26.25.3&#39;</span>
<span class="default_value">&#39;26.28.0&#39;</span>
</div>
@ -129,7 +129,7 @@
<section id="version_tuple">
<div class="attr variable">
<span class="name">version_tuple</span><span class="annotation">: object</span> =
<span class="default_value">(26, 25, 3)</span>
<span class="default_value">(26, 28, 0)</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.dialects API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -359,7 +359,7 @@ dialect implementations in order to understand how their various components can
<section id="Athena">
<div class="attr variable">
<span class="name">Athena</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796728384&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998209036672&#39;&gt;</span>
</div>
@ -371,7 +371,7 @@ dialect implementations in order to understand how their various components can
<section id="BigQuery">
<div class="attr variable">
<span class="name">BigQuery</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796081632&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998207084000&#39;&gt;</span>
</div>
@ -383,7 +383,7 @@ dialect implementations in order to understand how their various components can
<section id="ClickHouse">
<div class="attr variable">
<span class="name">ClickHouse</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571798395520&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998207095232&#39;&gt;</span>
</div>
@ -395,7 +395,7 @@ dialect implementations in order to understand how their various components can
<section id="Databricks">
<div class="attr variable">
<span class="name">Databricks</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571786944400&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998202197424&#39;&gt;</span>
</div>
@ -407,7 +407,7 @@ dialect implementations in order to understand how their various components can
<section id="Doris">
<div class="attr variable">
<span class="name">Doris</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571799701632&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213879552&#39;&gt;</span>
</div>
@ -419,7 +419,7 @@ dialect implementations in order to understand how their various components can
<section id="Drill">
<div class="attr variable">
<span class="name">Drill</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571798507328&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213878592&#39;&gt;</span>
</div>
@ -431,7 +431,7 @@ dialect implementations in order to understand how their various components can
<section id="Druid">
<div class="attr variable">
<span class="name">Druid</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571784920080&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218182256&#39;&gt;</span>
</div>
@ -443,7 +443,7 @@ dialect implementations in order to understand how their various components can
<section id="DuckDB">
<div class="attr variable">
<span class="name">DuckDB</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571784909808&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218189216&#39;&gt;</span>
</div>
@ -455,7 +455,7 @@ dialect implementations in order to understand how their various components can
<section id="Dune">
<div class="attr variable">
<span class="name">Dune</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785635072&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998204697984&#39;&gt;</span>
</div>
@ -467,7 +467,7 @@ dialect implementations in order to understand how their various components can
<section id="Hive">
<div class="attr variable">
<span class="name">Hive</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796939552&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218084672&#39;&gt;</span>
</div>
@ -479,7 +479,7 @@ dialect implementations in order to understand how their various components can
<section id="Materialize">
<div class="attr variable">
<span class="name">Materialize</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796933216&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998210512240&#39;&gt;</span>
</div>
@ -491,7 +491,7 @@ dialect implementations in order to understand how their various components can
<section id="MySQL">
<div class="attr variable">
<span class="name">MySQL</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571802007920&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998210508736&#39;&gt;</span>
</div>
@ -503,7 +503,7 @@ dialect implementations in order to understand how their various components can
<section id="Oracle">
<div class="attr variable">
<span class="name">Oracle</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571798015520&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998204295152&#39;&gt;</span>
</div>
@ -515,7 +515,7 @@ dialect implementations in order to understand how their various components can
<section id="Postgres">
<div class="attr variable">
<span class="name">Postgres</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571787331280&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213015728&#39;&gt;</span>
</div>
@ -527,7 +527,7 @@ dialect implementations in order to understand how their various components can
<section id="Presto">
<div class="attr variable">
<span class="name">Presto</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571792711184&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998207103072&#39;&gt;</span>
</div>
@ -539,7 +539,7 @@ dialect implementations in order to understand how their various components can
<section id="PRQL">
<div class="attr variable">
<span class="name">PRQL</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571790276352&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218107056&#39;&gt;</span>
</div>
@ -551,7 +551,7 @@ dialect implementations in order to understand how their various components can
<section id="Redshift">
<div class="attr variable">
<span class="name">Redshift</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796486896&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213994336&#39;&gt;</span>
</div>
@ -563,7 +563,7 @@ dialect implementations in order to understand how their various components can
<section id="RisingWave">
<div class="attr variable">
<span class="name">RisingWave</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571796480032&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213988768&#39;&gt;</span>
</div>
@ -575,7 +575,7 @@ dialect implementations in order to understand how their various components can
<section id="Snowflake">
<div class="attr variable">
<span class="name">Snowflake</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571798302544&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218915888&#39;&gt;</span>
</div>
@ -587,7 +587,7 @@ dialect implementations in order to understand how their various components can
<section id="Spark">
<div class="attr variable">
<span class="name">Spark</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571798306144&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218919824&#39;&gt;</span>
</div>
@ -599,7 +599,7 @@ dialect implementations in order to understand how their various components can
<section id="Spark2">
<div class="attr variable">
<span class="name">Spark2</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571795407632&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998209784848&#39;&gt;</span>
</div>
@ -611,7 +611,7 @@ dialect implementations in order to understand how their various components can
<section id="SQLite">
<div class="attr variable">
<span class="name">SQLite</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571791304560&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998214271904&#39;&gt;</span>
</div>
@ -623,7 +623,7 @@ dialect implementations in order to understand how their various components can
<section id="StarRocks">
<div class="attr variable">
<span class="name">StarRocks</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571795611968&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998214272816&#39;&gt;</span>
</div>
@ -635,7 +635,7 @@ dialect implementations in order to understand how their various components can
<section id="Tableau">
<div class="attr variable">
<span class="name">Tableau</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571793529520&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998213207136&#39;&gt;</span>
</div>
@ -647,7 +647,7 @@ dialect implementations in order to understand how their various components can
<section id="Teradata">
<div class="attr variable">
<span class="name">Teradata</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785251376&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218430752&#39;&gt;</span>
</div>
@ -659,7 +659,7 @@ dialect implementations in order to understand how their various components can
<section id="Trino">
<div class="attr variable">
<span class="name">Trino</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785259248&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998217361760&#39;&gt;</span>
</div>
@ -671,7 +671,7 @@ dialect implementations in order to understand how their various components can
<section id="TSQL">
<div class="attr variable">
<span class="name">TSQL</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785300000&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218034608&#39;&gt;</span>
</div>
@ -683,7 +683,7 @@ dialect implementations in order to understand how their various components can
<section id="Dialect">
<div class="attr variable">
<span class="name">Dialect</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785307920&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998218028656&#39;&gt;</span>
</div>
@ -695,7 +695,7 @@ dialect implementations in order to understand how their various components can
<section id="Dialects">
<div class="attr variable">
<span class="name">Dialects</span> =
<span class="default_value">&lt;MagicMock id=&#39;140571785332288&#39;&gt;</span>
<span class="default_value">&lt;MagicMock id=&#39;139998209690880&#39;&gt;</span>
</div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.dialects.druid API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -798,7 +798,6 @@ Default: True</li>
<dd id="Druid.Generator.generatedasrowcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.generatedasrowcolumnconstraint_sql">generatedasrowcolumnconstraint_sql</a></dd>
<dd id="Druid.Generator.periodforsystemtimeconstraint_sql" class="function"><a href="../generator.html#Generator.periodforsystemtimeconstraint_sql">periodforsystemtimeconstraint_sql</a></dd>
<dd id="Druid.Generator.notnullcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.notnullcolumnconstraint_sql">notnullcolumnconstraint_sql</a></dd>
<dd id="Druid.Generator.transformcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.transformcolumnconstraint_sql">transformcolumnconstraint_sql</a></dd>
<dd id="Druid.Generator.primarykeycolumnconstraint_sql" class="function"><a href="../generator.html#Generator.primarykeycolumnconstraint_sql">primarykeycolumnconstraint_sql</a></dd>
<dd id="Druid.Generator.uniquecolumnconstraint_sql" class="function"><a href="../generator.html#Generator.uniquecolumnconstraint_sql">uniquecolumnconstraint_sql</a></dd>
<dd id="Druid.Generator.createable_sql" class="function"><a href="../generator.html#Generator.createable_sql">createable_sql</a></dd>
@ -1010,6 +1009,7 @@ Default: True</li>
<dd id="Druid.Generator.add_column_sql" class="function"><a href="../generator.html#Generator.add_column_sql">add_column_sql</a></dd>
<dd id="Druid.Generator.droppartition_sql" class="function"><a href="../generator.html#Generator.droppartition_sql">droppartition_sql</a></dd>
<dd id="Druid.Generator.addconstraint_sql" class="function"><a href="../generator.html#Generator.addconstraint_sql">addconstraint_sql</a></dd>
<dd id="Druid.Generator.addpartition_sql" class="function"><a href="../generator.html#Generator.addpartition_sql">addpartition_sql</a></dd>
<dd id="Druid.Generator.distinct_sql" class="function"><a href="../generator.html#Generator.distinct_sql">distinct_sql</a></dd>
<dd id="Druid.Generator.ignorenulls_sql" class="function"><a href="../generator.html#Generator.ignorenulls_sql">ignorenulls_sql</a></dd>
<dd id="Druid.Generator.respectnulls_sql" class="function"><a href="../generator.html#Generator.respectnulls_sql">respectnulls_sql</a></dd>

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.dialects.dune API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -852,7 +852,6 @@ Default: True</li>
<dd id="Dune.Generator.generatedasrowcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.generatedasrowcolumnconstraint_sql">generatedasrowcolumnconstraint_sql</a></dd>
<dd id="Dune.Generator.periodforsystemtimeconstraint_sql" class="function"><a href="../generator.html#Generator.periodforsystemtimeconstraint_sql">periodforsystemtimeconstraint_sql</a></dd>
<dd id="Dune.Generator.notnullcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.notnullcolumnconstraint_sql">notnullcolumnconstraint_sql</a></dd>
<dd id="Dune.Generator.transformcolumnconstraint_sql" class="function"><a href="../generator.html#Generator.transformcolumnconstraint_sql">transformcolumnconstraint_sql</a></dd>
<dd id="Dune.Generator.primarykeycolumnconstraint_sql" class="function"><a href="../generator.html#Generator.primarykeycolumnconstraint_sql">primarykeycolumnconstraint_sql</a></dd>
<dd id="Dune.Generator.uniquecolumnconstraint_sql" class="function"><a href="../generator.html#Generator.uniquecolumnconstraint_sql">uniquecolumnconstraint_sql</a></dd>
<dd id="Dune.Generator.createable_sql" class="function"><a href="../generator.html#Generator.createable_sql">createable_sql</a></dd>
@ -1058,6 +1057,7 @@ Default: True</li>
<dd id="Dune.Generator.add_column_sql" class="function"><a href="../generator.html#Generator.add_column_sql">add_column_sql</a></dd>
<dd id="Dune.Generator.droppartition_sql" class="function"><a href="../generator.html#Generator.droppartition_sql">droppartition_sql</a></dd>
<dd id="Dune.Generator.addconstraint_sql" class="function"><a href="../generator.html#Generator.addconstraint_sql">addconstraint_sql</a></dd>
<dd id="Dune.Generator.addpartition_sql" class="function"><a href="../generator.html#Generator.addpartition_sql">addpartition_sql</a></dd>
<dd id="Dune.Generator.distinct_sql" class="function"><a href="../generator.html#Generator.distinct_sql">distinct_sql</a></dd>
<dd id="Dune.Generator.ignorenulls_sql" class="function"><a href="../generator.html#Generator.ignorenulls_sql">ignorenulls_sql</a></dd>
<dd id="Dune.Generator.respectnulls_sql" class="function"><a href="../generator.html#Generator.respectnulls_sql">respectnulls_sql</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

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

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.diff API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.errors API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.executor API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.executor.context API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.executor.env API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.executor.table API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.helper API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -2003,7 +2003,7 @@ belong to some totally-ordered set.</p>
<section id="DATE_UNITS">
<div class="attr variable">
<span class="name">DATE_UNITS</span> =
<span class="default_value">{&#39;day&#39;, &#39;year&#39;, &#39;year_month&#39;, &#39;quarter&#39;, &#39;week&#39;, &#39;month&#39;}</span>
<span class="default_value">{&#39;year&#39;, &#39;year_month&#39;, &#39;month&#39;, &#39;week&#39;, &#39;day&#39;, &#39;quarter&#39;}</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.jsonpath API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -641,7 +641,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">{&lt;class &#39;<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="ALL_JSON_PATH_PARTS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>&#39;&gt;}</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.lineage API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.canonicalize API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.eliminate_ctes API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.eliminate_joins API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.eliminate_subqueries API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.isolate_table_selects API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.merge_subqueries API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -581,7 +581,7 @@ queries if it would result in multiple table selects in a single query:</p>
<div class="attr variable">
<span class="name">UNMERGABLE_ARGS</span> =
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;options&#39;, &#39;qualify&#39;, &#39;group&#39;, &#39;locks&#39;, &#39;having&#39;, &#39;prewhere&#39;, &#39;kind&#39;, &#39;offset&#39;, &#39;cluster&#39;, &#39;distinct&#39;, &#39;operation_modifiers&#39;, &#39;settings&#39;, &#39;windows&#39;, &#39;limit&#39;, &#39;match&#39;, &#39;into&#39;, &#39;laterals&#39;, &#39;distribute&#39;, &#39;format&#39;, &#39;sample&#39;, &#39;connect&#39;, &#39;with&#39;, &#39;sort&#39;, &#39;pivots&#39;}</span>
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;windows&#39;, &#39;limit&#39;, &#39;settings&#39;, &#39;cluster&#39;, &#39;offset&#39;, &#39;options&#39;, &#39;format&#39;, &#39;connect&#39;, &#39;locks&#39;, &#39;distinct&#39;, &#39;distribute&#39;, &#39;pivots&#39;, &#39;operation_modifiers&#39;, &#39;having&#39;, &#39;sample&#39;, &#39;kind&#39;, &#39;prewhere&#39;, &#39;sort&#39;, &#39;match&#39;, &#39;group&#39;, &#39;with&#39;, &#39;qualify&#39;, &#39;laterals&#39;, &#39;into&#39;}</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.normalize API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.normalize_identifiers API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.optimize_joins API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.optimizer API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.pushdown_predicates API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.pushdown_projections API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.qualify API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.qualify_columns API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.qualify_tables API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.scope API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.simplify API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -3201,7 +3201,7 @@ prefix are statically known.</p>
<div class="attr variable">
<span class="name">DATETRUNC_COMPARISONS</span> =
<input id="DATETRUNC_COMPARISONS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#LT">sqlglot.expressions.LT</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#GT">sqlglot.expressions.GT</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#In">sqlglot.expressions.In</a>&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#GT">sqlglot.expressions.GT</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#In">sqlglot.expressions.In</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#LT">sqlglot.expressions.LT</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>&#39;&gt;}</span>
</div>
@ -3285,7 +3285,7 @@ prefix are statically known.</p>
<section id="JOINS">
<div class="attr variable">
<span class="name">JOINS</span> =
<span class="default_value">{(&#39;&#39;, &#39;&#39;), (&#39;RIGHT&#39;, &#39;OUTER&#39;), (&#39;RIGHT&#39;, &#39;&#39;), (&#39;&#39;, &#39;INNER&#39;)}</span>
<span class="default_value">{(&#39;&#39;, &#39;INNER&#39;), (&#39;RIGHT&#39;, &#39;OUTER&#39;), (&#39;RIGHT&#39;, &#39;&#39;), (&#39;&#39;, &#39;&#39;)}</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.optimizer.unnest_subqueries API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.planner API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.schema API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.serde API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

File diff suppressed because one or more lines are too long

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.tokens API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -9516,7 +9516,7 @@
<div class="attr variable">
<span class="name">TOKENS_PRECEDING_HINT</span> =
<input id="Tokenizer.TOKENS_PRECEDING_HINT-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Tokenizer.TOKENS_PRECEDING_HINT-view-value"></label><span class="default_value">{&lt;<a href="#TokenType.SELECT">TokenType.SELECT</a>: &#39;SELECT&#39;&gt;, &lt;<a href="#TokenType.INSERT">TokenType.INSERT</a>: &#39;INSERT&#39;&gt;, &lt;<a href="#TokenType.UPDATE">TokenType.UPDATE</a>: &#39;UPDATE&#39;&gt;, &lt;<a href="#TokenType.DELETE">TokenType.DELETE</a>: &#39;DELETE&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="Tokenizer.TOKENS_PRECEDING_HINT-view-value"></label><span class="default_value">{&lt;<a href="#TokenType.DELETE">TokenType.DELETE</a>: &#39;DELETE&#39;&gt;, &lt;<a href="#TokenType.SELECT">TokenType.SELECT</a>: &#39;SELECT&#39;&gt;, &lt;<a href="#TokenType.INSERT">TokenType.INSERT</a>: &#39;INSERT&#39;&gt;, &lt;<a href="#TokenType.UPDATE">TokenType.UPDATE</a>: &#39;UPDATE&#39;&gt;}</span>
</div>
@ -9555,7 +9555,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">{&lt;<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: &#39;EXECUTE&#39;&gt;, &lt;<a href="#TokenType.SHOW">TokenType.SHOW</a>: &#39;SHOW&#39;&gt;, &lt;<a href="#TokenType.RENAME">TokenType.RENAME</a>: &#39;RENAME&#39;&gt;, &lt;<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: &#39;COMMAND&#39;&gt;, &lt;<a href="#TokenType.FETCH">TokenType.FETCH</a>: &#39;FETCH&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{&lt;<a href="#TokenType.SHOW">TokenType.SHOW</a>: &#39;SHOW&#39;&gt;, &lt;<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: &#39;COMMAND&#39;&gt;, &lt;<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: &#39;EXECUTE&#39;&gt;, &lt;<a href="#TokenType.RENAME">TokenType.RENAME</a>: &#39;RENAME&#39;&gt;, &lt;<a href="#TokenType.FETCH">TokenType.FETCH</a>: &#39;FETCH&#39;&gt;}</span>
</div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.transforms API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@ -978,173 +978,182 @@
</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><span id="L-844"><a href="#L-844"><span class="linenos"> 844</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_join_marks</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-845"><a href="#L-845"><span class="linenos"> 845</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-846"><a href="#L-846"><span class="linenos"> 846</span></a><span class="sd"> Remove join marks from an AST. This rule assumes that all marked columns are qualified.</span>
</span><span id="L-847"><a href="#L-847"><span class="linenos"> 847</span></a><span class="sd"> If this does not hold for a query, consider running `sqlglot.optimizer.qualify` first.</span>
</span><span id="L-845"><a href="#L-845"><span class="linenos"> 845</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178</span>
</span><span id="L-846"><a href="#L-846"><span class="linenos"> 846</span></a>
</span><span id="L-847"><a href="#L-847"><span class="linenos"> 847</span></a><span class="sd"> 1. You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.</span>
</span><span id="L-848"><a href="#L-848"><span class="linenos"> 848</span></a>
</span><span id="L-849"><a href="#L-849"><span class="linenos"> 849</span></a><span class="sd"> For example,</span>
</span><span id="L-850"><a href="#L-850"><span class="linenos"> 850</span></a><span class="sd"> SELECT * FROM a, b WHERE a.id = b.id(+) -- ... is converted to</span>
</span><span id="L-851"><a href="#L-851"><span class="linenos"> 851</span></a><span class="sd"> SELECT * FROM a LEFT JOIN b ON a.id = b.id -- this</span>
</span><span id="L-849"><a href="#L-849"><span class="linenos"> 849</span></a><span class="sd"> 2. The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.</span>
</span><span id="L-850"><a href="#L-850"><span class="linenos"> 850</span></a>
</span><span id="L-851"><a href="#L-851"><span class="linenos"> 851</span></a><span class="sd"> The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.</span>
</span><span id="L-852"><a href="#L-852"><span class="linenos"> 852</span></a>
</span><span id="L-853"><a href="#L-853"><span class="linenos"> 853</span></a><span class="sd"> Args:</span>
</span><span id="L-854"><a href="#L-854"><span class="linenos"> 854</span></a><span class="sd"> expression: The AST to remove join marks from.</span>
</span><span id="L-855"><a href="#L-855"><span class="linenos"> 855</span></a>
</span><span id="L-856"><a href="#L-856"><span class="linenos"> 856</span></a><span class="sd"> Returns:</span>
</span><span id="L-857"><a href="#L-857"><span class="linenos"> 857</span></a><span class="sd"> The AST with join marks removed.</span>
</span><span id="L-858"><a href="#L-858"><span class="linenos"> 858</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-859"><a href="#L-859"><span class="linenos"> 859</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">traverse_scope</span>
</span><span id="L-853"><a href="#L-853"><span class="linenos"> 853</span></a><span class="sd"> You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.</span>
</span><span id="L-854"><a href="#L-854"><span class="linenos"> 854</span></a>
</span><span id="L-855"><a href="#L-855"><span class="linenos"> 855</span></a><span class="sd"> The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.</span>
</span><span id="L-856"><a href="#L-856"><span class="linenos"> 856</span></a>
</span><span id="L-857"><a href="#L-857"><span class="linenos"> 857</span></a><span class="sd"> A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.</span>
</span><span id="L-858"><a href="#L-858"><span class="linenos"> 858</span></a>
</span><span id="L-859"><a href="#L-859"><span class="linenos"> 859</span></a><span class="sd"> A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.</span>
</span><span id="L-860"><a href="#L-860"><span class="linenos"> 860</span></a>
</span><span id="L-861"><a href="#L-861"><span class="linenos"> 861</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-862"><a href="#L-862"><span class="linenos"> 862</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="L-863"><a href="#L-863"><span class="linenos"> 863</span></a>
</span><span id="L-864"><a href="#L-864"><span class="linenos"> 864</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">)</span>
</span><span id="L-865"><a href="#L-865"><span class="linenos"> 865</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span>
</span><span id="L-866"><a href="#L-866"><span class="linenos"> 866</span></a>
</span><span id="L-867"><a href="#L-867"><span class="linenos"> 867</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">joins</span><span class="p">:</span>
</span><span id="L-868"><a href="#L-868"><span class="linenos"> 868</span></a> <span class="k">continue</span>
</span><span id="L-869"><a href="#L-869"><span class="linenos"> 869</span></a>
</span><span id="L-870"><a href="#L-870"><span class="linenos"> 870</span></a> <span class="n">query_from</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span>
</span><span id="L-871"><a href="#L-871"><span class="linenos"> 871</span></a>
</span><span id="L-872"><a href="#L-872"><span class="linenos"> 872</span></a> <span class="c1"># These keep track of the joins to be replaced</span>
</span><span id="L-873"><a href="#L-873"><span class="linenos"> 873</span></a> <span class="n">new_joins</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-874"><a href="#L-874"><span class="linenos"> 874</span></a> <span class="n">old_joins</span> <span class="o">=</span> <span class="p">{</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">join</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">}</span>
</span><span id="L-861"><a href="#L-861"><span class="linenos"> 861</span></a><span class="sd"> A WHERE condition cannot compare any column marked with the (+) operator with a subquery.</span>
</span><span id="L-862"><a href="#L-862"><span class="linenos"> 862</span></a>
</span><span id="L-863"><a href="#L-863"><span class="linenos"> 863</span></a><span class="sd"> -- example with WHERE</span>
</span><span id="L-864"><a href="#L-864"><span class="linenos"> 864</span></a><span class="sd"> SELECT d.department_name, sum(e.salary) as total_salary</span>
</span><span id="L-865"><a href="#L-865"><span class="linenos"> 865</span></a><span class="sd"> FROM departments d, employees e</span>
</span><span id="L-866"><a href="#L-866"><span class="linenos"> 866</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id</span>
</span><span id="L-867"><a href="#L-867"><span class="linenos"> 867</span></a><span class="sd"> group by department_name</span>
</span><span id="L-868"><a href="#L-868"><span class="linenos"> 868</span></a>
</span><span id="L-869"><a href="#L-869"><span class="linenos"> 869</span></a><span class="sd"> -- example of left correlation in select</span>
</span><span id="L-870"><a href="#L-870"><span class="linenos"> 870</span></a><span class="sd"> SELECT d.department_name, (</span>
</span><span id="L-871"><a href="#L-871"><span class="linenos"> 871</span></a><span class="sd"> SELECT SUM(e.salary)</span>
</span><span id="L-872"><a href="#L-872"><span class="linenos"> 872</span></a><span class="sd"> FROM employees e</span>
</span><span id="L-873"><a href="#L-873"><span class="linenos"> 873</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id) AS total_salary</span>
</span><span id="L-874"><a href="#L-874"><span class="linenos"> 874</span></a><span class="sd"> FROM departments d;</span>
</span><span id="L-875"><a href="#L-875"><span class="linenos"> 875</span></a>
</span><span id="L-876"><a href="#L-876"><span class="linenos"> 876</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-877"><a href="#L-877"><span class="linenos"> 877</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">column</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">):</span>
</span><span id="L-878"><a href="#L-878"><span class="linenos"> 878</span></a> <span class="k">continue</span>
</span><span id="L-879"><a href="#L-879"><span class="linenos"> 879</span></a>
</span><span id="L-880"><a href="#L-880"><span class="linenos"> 880</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 class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-881"><a href="#L-881"><span class="linenos"> 881</span></a> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="L-882"><a href="#L-882"><span class="linenos"> 882</span></a> <span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span>
</span><span id="L-883"><a href="#L-883"><span class="linenos"> 883</span></a> <span class="p">),</span> <span class="s2">&quot;Columns can only be marked with (+) when involved in a binary operation&quot;</span>
</span><span id="L-876"><a href="#L-876"><span class="linenos"> 876</span></a><span class="sd"> -- example of left correlation in from</span>
</span><span id="L-877"><a href="#L-877"><span class="linenos"> 877</span></a><span class="sd"> SELECT d.department_name, t.total_salary</span>
</span><span id="L-878"><a href="#L-878"><span class="linenos"> 878</span></a><span class="sd"> FROM departments d, (</span>
</span><span id="L-879"><a href="#L-879"><span class="linenos"> 879</span></a><span class="sd"> SELECT SUM(e.salary) AS total_salary</span>
</span><span id="L-880"><a href="#L-880"><span class="linenos"> 880</span></a><span class="sd"> FROM employees e</span>
</span><span id="L-881"><a href="#L-881"><span class="linenos"> 881</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id</span>
</span><span id="L-882"><a href="#L-882"><span class="linenos"> 882</span></a><span class="sd"> ) t</span>
</span><span id="L-883"><a href="#L-883"><span class="linenos"> 883</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-884"><a href="#L-884"><span class="linenos"> 884</span></a>
</span><span id="L-885"><a href="#L-885"><span class="linenos"> 885</span></a> <span class="n">predicate_parent</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-886"><a href="#L-886"><span class="linenos"> 886</span></a> <span class="n">join_predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-887"><a href="#L-887"><span class="linenos"> 887</span></a>
</span><span id="L-888"><a href="#L-888"><span class="linenos"> 888</span></a> <span class="n">left_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-889"><a href="#L-889"><span class="linenos"> 889</span></a> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">join_predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span>
</span><span id="L-890"><a href="#L-890"><span class="linenos"> 890</span></a> <span class="p">]</span>
</span><span id="L-891"><a href="#L-891"><span class="linenos"> 891</span></a> <span class="n">right_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-892"><a href="#L-892"><span class="linenos"> 892</span></a> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">join_predicate</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span>
</span><span id="L-893"><a href="#L-893"><span class="linenos"> 893</span></a> <span class="p">]</span>
</span><span id="L-894"><a href="#L-894"><span class="linenos"> 894</span></a>
</span><span id="L-895"><a href="#L-895"><span class="linenos"> 895</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-896"><a href="#L-896"><span class="linenos"> 896</span></a> <span class="n">left_columns</span> <span class="ow">and</span> <span class="n">right_columns</span>
</span><span id="L-897"><a href="#L-897"><span class="linenos"> 897</span></a> <span class="p">),</span> <span class="s2">&quot;The (+) marker cannot appear in both sides of a binary predicate&quot;</span>
</span><span id="L-885"><a href="#L-885"><span class="linenos"> 885</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">traverse_scope</span>
</span><span id="L-886"><a href="#L-886"><span class="linenos"> 886</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.normalize</span><span class="w"> </span><span class="kn">import</span> <span class="n">normalize</span><span class="p">,</span> <span class="n">normalized</span>
</span><span id="L-887"><a href="#L-887"><span class="linenos"> 887</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
</span><span id="L-888"><a href="#L-888"><span class="linenos"> 888</span></a>
</span><span id="L-889"><a href="#L-889"><span class="linenos"> 889</span></a> <span class="c1"># we go in reverse to check the main query for left correlation</span>
</span><span id="L-890"><a href="#L-890"><span class="linenos"> 890</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)):</span>
</span><span id="L-891"><a href="#L-891"><span class="linenos"> 891</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="L-892"><a href="#L-892"><span class="linenos"> 892</span></a>
</span><span id="L-893"><a href="#L-893"><span class="linenos"> 893</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">)</span>
</span><span id="L-894"><a href="#L-894"><span class="linenos"> 894</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="p">[])</span>
</span><span id="L-895"><a href="#L-895"><span class="linenos"> 895</span></a>
</span><span id="L-896"><a href="#L-896"><span class="linenos"> 896</span></a> <span class="c1"># knockout: we do not support left correlation (see point 2)</span>
</span><span id="L-897"><a href="#L-897"><span class="linenos"> 897</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">is_correlated_subquery</span><span class="p">,</span> <span class="s2">&quot;Correlated queries are not supported&quot;</span>
</span><span id="L-898"><a href="#L-898"><span class="linenos"> 898</span></a>
</span><span id="L-899"><a href="#L-899"><span class="linenos"> 899</span></a> <span class="n">marked_column_tables</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</span><span id="L-900"><a href="#L-900"><span class="linenos"> 900</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">left_columns</span> <span class="ow">or</span> <span class="n">right_columns</span><span class="p">:</span>
</span><span id="L-901"><a href="#L-901"><span class="linenos"> 901</span></a> <span class="n">table</span> <span class="o">=</span> <span class="n">col</span><span class="o">.</span><span class="n">table</span>
</span><span id="L-902"><a href="#L-902"><span class="linenos"> 902</span></a> <span class="k">assert</span> <span class="n">table</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;Column </span><span class="si">{</span><span class="n">col</span><span class="si">}</span><span class="s2"> needs to be qualified with a table&quot;</span>
</span><span id="L-903"><a href="#L-903"><span class="linenos"> 903</span></a>
</span><span id="L-904"><a href="#L-904"><span class="linenos"> 904</span></a> <span class="n">col</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-905"><a href="#L-905"><span class="linenos"> 905</span></a> <span class="n">marked_column_tables</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
</span><span id="L-899"><a href="#L-899"><span class="linenos"> 899</span></a> <span class="c1"># nothing to do - we check it here after knockout above</span>
</span><span id="L-900"><a href="#L-900"><span class="linenos"> 900</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">where</span><span class="o">.</span><span class="n">find_all</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-901"><a href="#L-901"><span class="linenos"> 901</span></a> <span class="k">continue</span>
</span><span id="L-902"><a href="#L-902"><span class="linenos"> 902</span></a>
</span><span id="L-903"><a href="#L-903"><span class="linenos"> 903</span></a> <span class="c1"># make sure we have AND of ORs to have clear join terms</span>
</span><span id="L-904"><a href="#L-904"><span class="linenos"> 904</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="L-905"><a href="#L-905"><span class="linenos"> 905</span></a> <span class="k">assert</span> <span class="n">normalized</span><span class="p">(</span><span class="n">where</span><span class="p">),</span> <span class="s2">&quot;Cannot normalize JOIN predicates&quot;</span>
</span><span id="L-906"><a href="#L-906"><span class="linenos"> 906</span></a>
</span><span id="L-907"><a href="#L-907"><span class="linenos"> 907</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="L-908"><a href="#L-908"><span class="linenos"> 908</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">marked_column_tables</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
</span><span id="L-909"><a href="#L-909"><span class="linenos"> 909</span></a> <span class="p">),</span> <span class="s2">&quot;Columns of only a single table can be marked with (+) in a given binary predicate&quot;</span>
</span><span id="L-907"><a href="#L-907"><span class="linenos"> 907</span></a> <span class="n">joins_ons</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="c1"># dict of {name: list of join AND conditions}</span>
</span><span id="L-908"><a href="#L-908"><span class="linenos"> 908</span></a> <span class="k">for</span> <span class="n">cond</span> <span class="ow">in</span> <span class="p">[</span><span class="n">where</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">else</span> <span class="n">where</span><span class="o">.</span><span class="n">flatten</span><span class="p">():</span>
</span><span id="L-909"><a href="#L-909"><span class="linenos"> 909</span></a> <span class="n">join_cols</span> <span class="o">=</span> <span class="p">[</span><span class="n">col</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">cond</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)]</span>
</span><span id="L-910"><a href="#L-910"><span class="linenos"> 910</span></a>
</span><span id="L-911"><a href="#L-911"><span class="linenos"> 911</span></a> <span class="c1"># Add predicate if join already copied, or add join if it is new</span>
</span><span id="L-912"><a href="#L-912"><span class="linenos"> 912</span></a> <span class="n">join_this</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">col</span><span class="o">.</span><span class="n">table</span><span class="p">,</span> <span class="n">query_from</span><span class="p">)</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-913"><a href="#L-913"><span class="linenos"> 913</span></a> <span class="n">existing_join</span> <span class="o">=</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">join_this</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span>
</span><span id="L-914"><a href="#L-914"><span class="linenos"> 914</span></a> <span class="k">if</span> <span class="n">existing_join</span><span class="p">:</span>
</span><span id="L-915"><a href="#L-915"><span class="linenos"> 915</span></a> <span class="n">existing_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span><span class="n">existing_join</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">join_predicate</span><span class="p">))</span>
</span><span id="L-916"><a href="#L-916"><span class="linenos"> 916</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-917"><a href="#L-917"><span class="linenos"> 917</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">join_this</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span>
</span><span id="L-918"><a href="#L-918"><span class="linenos"> 918</span></a> <span class="n">this</span><span class="o">=</span><span class="n">join_this</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">on</span><span class="o">=</span><span class="n">join_predicate</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;LEFT&quot;</span>
</span><span id="L-919"><a href="#L-919"><span class="linenos"> 919</span></a> <span class="p">)</span>
</span><span id="L-920"><a href="#L-920"><span class="linenos"> 920</span></a>
</span><span id="L-921"><a href="#L-921"><span class="linenos"> 921</span></a> <span class="c1"># If the parent of the target predicate is a binary node, then it now has only one child</span>
</span><span id="L-922"><a href="#L-922"><span class="linenos"> 922</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate_parent</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-923"><a href="#L-923"><span class="linenos"> 923</span></a> <span class="k">if</span> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-924"><a href="#L-924"><span class="linenos"> 924</span></a> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">predicate_parent</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
</span><span id="L-925"><a href="#L-925"><span class="linenos"> 925</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-926"><a href="#L-926"><span class="linenos"> 926</span></a> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">predicate_parent</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
</span><span id="L-911"><a href="#L-911"><span class="linenos"> 911</span></a> <span class="n">left_join_table</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">col</span><span class="o">.</span><span class="n">table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">join_cols</span><span class="p">)</span>
</span><span id="L-912"><a href="#L-912"><span class="linenos"> 912</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">left_join_table</span><span class="p">:</span>
</span><span id="L-913"><a href="#L-913"><span class="linenos"> 913</span></a> <span class="k">continue</span>
</span><span id="L-914"><a href="#L-914"><span class="linenos"> 914</span></a>
</span><span id="L-915"><a href="#L-915"><span class="linenos"> 915</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-916"><a href="#L-916"><span class="linenos"> 916</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">left_join_table</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="L-917"><a href="#L-917"><span class="linenos"> 917</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot combine JOIN predicates from different tables&quot;</span>
</span><span id="L-918"><a href="#L-918"><span class="linenos"> 918</span></a>
</span><span id="L-919"><a href="#L-919"><span class="linenos"> 919</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">join_cols</span><span class="p">:</span>
</span><span id="L-920"><a href="#L-920"><span class="linenos"> 920</span></a> <span class="n">col</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-921"><a href="#L-921"><span class="linenos"> 921</span></a>
</span><span id="L-922"><a href="#L-922"><span class="linenos"> 922</span></a> <span class="n">joins_ons</span><span class="p">[</span><span class="n">left_join_table</span><span class="o">.</span><span class="n">pop</span><span class="p">()]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cond</span><span class="p">)</span>
</span><span id="L-923"><a href="#L-923"><span class="linenos"> 923</span></a>
</span><span id="L-924"><a href="#L-924"><span class="linenos"> 924</span></a> <span class="n">old_joins</span> <span class="o">=</span> <span class="p">{</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">join</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">}</span>
</span><span id="L-925"><a href="#L-925"><span class="linenos"> 925</span></a> <span class="n">new_joins</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-926"><a href="#L-926"><span class="linenos"> 926</span></a> <span class="n">query_from</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span>
</span><span id="L-927"><a href="#L-927"><span class="linenos"> 927</span></a>
</span><span id="L-928"><a href="#L-928"><span class="linenos"> 928</span></a> <span class="n">only_old_join_sources</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="o">-</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</span><span id="L-929"><a href="#L-929"><span class="linenos"> 929</span></a>
</span><span id="L-930"><a href="#L-930"><span class="linenos"> 930</span></a> <span class="k">if</span> <span class="n">query_from</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">in</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-931"><a href="#L-931"><span class="linenos"> 931</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="L-932"><a href="#L-932"><span class="linenos"> 932</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">only_old_join_sources</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span>
</span><span id="L-933"><a href="#L-933"><span class="linenos"> 933</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot determine which table to use in the new FROM clause&quot;</span>
</span><span id="L-934"><a href="#L-934"><span class="linenos"> 934</span></a>
</span><span id="L-935"><a href="#L-935"><span class="linenos"> 935</span></a> <span class="n">new_from_name</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">only_old_join_sources</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-936"><a href="#L-936"><span class="linenos"> 936</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;from&quot;</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">this</span><span class="o">=</span><span class="n">old_joins</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">new_from_name</span><span class="p">)</span><span class="o">.</span><span class="n">this</span><span class="p">))</span>
</span><span id="L-937"><a href="#L-937"><span class="linenos"> 937</span></a> <span class="n">only_old_join_sources</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">new_from_name</span><span class="p">)</span>
</span><span id="L-938"><a href="#L-938"><span class="linenos"> 938</span></a>
</span><span id="L-939"><a href="#L-939"><span class="linenos"> 939</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-940"><a href="#L-940"><span class="linenos"> 940</span></a> <span class="n">only_old_join_expressions</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-941"><a href="#L-941"><span class="linenos"> 941</span></a> <span class="k">for</span> <span class="n">old_join_source</span> <span class="ow">in</span> <span class="n">only_old_join_sources</span><span class="p">:</span>
</span><span id="L-942"><a href="#L-942"><span class="linenos"> 942</span></a> <span class="n">old_join_expression</span> <span class="o">=</span> <span class="n">old_joins</span><span class="p">[</span><span class="n">old_join_source</span><span class="p">]</span>
</span><span id="L-943"><a href="#L-943"><span class="linenos"> 943</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">old_join_expression</span><span class="o">.</span><span class="n">kind</span><span class="p">:</span>
</span><span id="L-944"><a href="#L-944"><span class="linenos"> 944</span></a> <span class="n">old_join_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="L-945"><a href="#L-945"><span class="linenos"> 945</span></a>
</span><span id="L-946"><a href="#L-946"><span class="linenos"> 946</span></a> <span class="n">only_old_join_expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">old_join_expression</span><span class="p">)</span>
</span><span id="L-947"><a href="#L-947"><span class="linenos"> 947</span></a>
</span><span id="L-948"><a href="#L-948"><span class="linenos"> 948</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_joins</span><span class="o">.</span><span class="n">values</span><span class="p">())</span> <span class="o">+</span> <span class="n">only_old_join_expressions</span><span class="p">)</span>
</span><span id="L-949"><a href="#L-949"><span class="linenos"> 949</span></a>
</span><span id="L-950"><a href="#L-950"><span class="linenos"> 950</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
</span><span id="L-951"><a href="#L-951"><span class="linenos"> 951</span></a> <span class="n">where</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-952"><a href="#L-952"><span class="linenos"> 952</span></a>
</span><span id="L-953"><a href="#L-953"><span class="linenos"> 953</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-954"><a href="#L-954"><span class="linenos"> 954</span></a>
</span><span id="L-955"><a href="#L-955"><span class="linenos"> 955</span></a>
</span><span id="L-956"><a href="#L-956"><span class="linenos"> 956</span></a><span class="k">def</span><span class="w"> </span><span class="nf">any_to_exists</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-957"><a href="#L-957"><span class="linenos"> 957</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-958"><a href="#L-958"><span class="linenos"> 958</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</span>
</span><span id="L-959"><a href="#L-959"><span class="linenos"> 959</span></a>
</span><span id="L-960"><a href="#L-960"><span class="linenos"> 960</span></a><span class="sd"> For example,</span>
</span><span id="L-961"><a href="#L-961"><span class="linenos"> 961</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="L-962"><a href="#L-962"><span class="linenos"> 962</span></a><span class="sd"> - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -&gt; x &lt; 5)</span>
</span><span id="L-928"><a href="#L-928"><span class="linenos"> 928</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">predicates</span> <span class="ow">in</span> <span class="n">joins_ons</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="L-929"><a href="#L-929"><span class="linenos"> 929</span></a> <span class="n">join_what</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">query_from</span><span class="p">)</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-930"><a href="#L-930"><span class="linenos"> 930</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">join_what</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span>
</span><span id="L-931"><a href="#L-931"><span class="linenos"> 931</span></a> <span class="n">this</span><span class="o">=</span><span class="n">join_what</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span><span class="o">*</span><span class="n">predicates</span><span class="p">),</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;LEFT&quot;</span>
</span><span id="L-932"><a href="#L-932"><span class="linenos"> 932</span></a> <span class="p">)</span>
</span><span id="L-933"><a href="#L-933"><span class="linenos"> 933</span></a>
</span><span id="L-934"><a href="#L-934"><span class="linenos"> 934</span></a> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">predicates</span><span class="p">:</span>
</span><span id="L-935"><a href="#L-935"><span class="linenos"> 935</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</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">Paren</span><span class="p">):</span>
</span><span id="L-936"><a href="#L-936"><span class="linenos"> 936</span></a> <span class="n">p</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">p</span><span class="p">)</span>
</span><span id="L-937"><a href="#L-937"><span class="linenos"> 937</span></a>
</span><span id="L-938"><a href="#L-938"><span class="linenos"> 938</span></a> <span class="n">parent</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-939"><a href="#L-939"><span class="linenos"> 939</span></a> <span class="n">p</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-940"><a href="#L-940"><span class="linenos"> 940</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</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-941"><a href="#L-941"><span class="linenos"> 941</span></a> <span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">right</span> <span class="k">if</span> <span class="n">parent</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">parent</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
</span><span id="L-942"><a href="#L-942"><span class="linenos"> 942</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="L-943"><a href="#L-943"><span class="linenos"> 943</span></a> <span class="n">parent</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-944"><a href="#L-944"><span class="linenos"> 944</span></a>
</span><span id="L-945"><a href="#L-945"><span class="linenos"> 945</span></a> <span class="k">if</span> <span class="n">query_from</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">in</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-946"><a href="#L-946"><span class="linenos"> 946</span></a> <span class="n">only_old_joins</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="o">-</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</span><span id="L-947"><a href="#L-947"><span class="linenos"> 947</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="L-948"><a href="#L-948"><span class="linenos"> 948</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">only_old_joins</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span>
</span><span id="L-949"><a href="#L-949"><span class="linenos"> 949</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot determine which table to use in the new FROM clause&quot;</span>
</span><span id="L-950"><a href="#L-950"><span class="linenos"> 950</span></a>
</span><span id="L-951"><a href="#L-951"><span class="linenos"> 951</span></a> <span class="n">new_from_name</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">only_old_joins</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-952"><a href="#L-952"><span class="linenos"> 952</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;from&quot;</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">this</span><span class="o">=</span><span class="n">old_joins</span><span class="p">[</span><span class="n">new_from_name</span><span class="p">]</span><span class="o">.</span><span class="n">this</span><span class="p">))</span>
</span><span id="L-953"><a href="#L-953"><span class="linenos"> 953</span></a>
</span><span id="L-954"><a href="#L-954"><span class="linenos"> 954</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-955"><a href="#L-955"><span class="linenos"> 955</span></a> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="c1"># preserve any other joins</span>
</span><span id="L-956"><a href="#L-956"><span class="linenos"> 956</span></a> <span class="k">if</span> <span class="n">n</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">new_joins</span> <span class="ow">and</span> <span class="n">n</span> <span class="o">!=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
</span><span id="L-957"><a href="#L-957"><span class="linenos"> 957</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">j</span><span class="o">.</span><span class="n">kind</span><span class="p">:</span>
</span><span id="L-958"><a href="#L-958"><span class="linenos"> 958</span></a> <span class="n">j</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="L-959"><a href="#L-959"><span class="linenos"> 959</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span>
</span><span id="L-960"><a href="#L-960"><span class="linenos"> 960</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_joins</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
</span><span id="L-961"><a href="#L-961"><span class="linenos"> 961</span></a>
</span><span id="L-962"><a href="#L-962"><span class="linenos"> 962</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-963"><a href="#L-963"><span class="linenos"> 963</span></a>
</span><span id="L-964"><a href="#L-964"><span class="linenos"> 964</span></a><span class="sd"> Both ANY and EXISTS accept queries but currently only array expressions are supported for this</span>
</span><span id="L-965"><a href="#L-965"><span class="linenos"> 965</span></a><span class="sd"> transformation</span>
</span><span id="L-966"><a href="#L-966"><span class="linenos"> 966</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-967"><a href="#L-967"><span class="linenos"> 967</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
</span><span id="L-968"><a href="#L-968"><span class="linenos"> 968</span></a> <span class="k">for</span> <span class="n">any_expr</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</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-969"><a href="#L-969"><span class="linenos"> 969</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-970"><a href="#L-970"><span class="linenos"> 970</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
</span><span id="L-971"><a href="#L-971"><span class="linenos"> 971</span></a> <span class="k">continue</span>
</span><span id="L-964"><a href="#L-964"><span class="linenos"> 964</span></a>
</span><span id="L-965"><a href="#L-965"><span class="linenos"> 965</span></a><span class="k">def</span><span class="w"> </span><span class="nf">any_to_exists</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-966"><a href="#L-966"><span class="linenos"> 966</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-967"><a href="#L-967"><span class="linenos"> 967</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</span>
</span><span id="L-968"><a href="#L-968"><span class="linenos"> 968</span></a>
</span><span id="L-969"><a href="#L-969"><span class="linenos"> 969</span></a><span class="sd"> For example,</span>
</span><span id="L-970"><a href="#L-970"><span class="linenos"> 970</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="L-971"><a href="#L-971"><span class="linenos"> 971</span></a><span class="sd"> - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -&gt; x &lt; 5)</span>
</span><span id="L-972"><a href="#L-972"><span class="linenos"> 972</span></a>
</span><span id="L-973"><a href="#L-973"><span class="linenos"> 973</span></a> <span class="n">binop</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-974"><a href="#L-974"><span class="linenos"> 974</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">binop</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-975"><a href="#L-975"><span class="linenos"> 975</span></a> <span class="n">lambda_arg</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="s2">&quot;x&quot;</span><span class="p">)</span>
</span><span id="L-976"><a href="#L-976"><span class="linenos"> 976</span></a> <span class="n">any_expr</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">lambda_arg</span><span class="p">)</span>
</span><span id="L-977"><a href="#L-977"><span class="linenos"> 977</span></a> <span class="n">lambda_expr</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lambda</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">binop</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">lambda_arg</span><span class="p">])</span>
</span><span id="L-978"><a href="#L-978"><span class="linenos"> 978</span></a> <span class="n">binop</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">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="o">.</span><span class="n">unnest</span><span class="p">(),</span> <span class="n">expression</span><span class="o">=</span><span class="n">lambda_expr</span><span class="p">))</span>
</span><span id="L-979"><a href="#L-979"><span class="linenos"> 979</span></a>
</span><span id="L-980"><a href="#L-980"><span class="linenos"> 980</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-973"><a href="#L-973"><span class="linenos"> 973</span></a><span class="sd"> Both ANY and EXISTS accept queries but currently only array expressions are supported for this</span>
</span><span id="L-974"><a href="#L-974"><span class="linenos"> 974</span></a><span class="sd"> transformation</span>
</span><span id="L-975"><a href="#L-975"><span class="linenos"> 975</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-976"><a href="#L-976"><span class="linenos"> 976</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
</span><span id="L-977"><a href="#L-977"><span class="linenos"> 977</span></a> <span class="k">for</span> <span class="n">any_expr</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</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-978"><a href="#L-978"><span class="linenos"> 978</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-979"><a href="#L-979"><span class="linenos"> 979</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
</span><span id="L-980"><a href="#L-980"><span class="linenos"> 980</span></a> <span class="k">continue</span>
</span><span id="L-981"><a href="#L-981"><span class="linenos"> 981</span></a>
</span><span id="L-982"><a href="#L-982"><span class="linenos"> 982</span></a>
</span><span id="L-983"><a href="#L-983"><span class="linenos"> 983</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_window_clause</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-984"><a href="#L-984"><span class="linenos"> 984</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Eliminates the `WINDOW` query clause by inling each named window.&quot;&quot;&quot;</span>
</span><span id="L-985"><a href="#L-985"><span class="linenos"> 985</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">):</span>
</span><span id="L-986"><a href="#L-986"><span class="linenos"> 986</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_all_in_scope</span>
</span><span id="L-987"><a href="#L-987"><span class="linenos"> 987</span></a>
</span><span id="L-988"><a href="#L-988"><span class="linenos"> 988</span></a> <span class="n">windows</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;windows&quot;</span><span class="p">]</span>
</span><span id="L-989"><a href="#L-989"><span class="linenos"> 989</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-982"><a href="#L-982"><span class="linenos"> 982</span></a> <span class="n">binop</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-983"><a href="#L-983"><span class="linenos"> 983</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">binop</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-984"><a href="#L-984"><span class="linenos"> 984</span></a> <span class="n">lambda_arg</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="s2">&quot;x&quot;</span><span class="p">)</span>
</span><span id="L-985"><a href="#L-985"><span class="linenos"> 985</span></a> <span class="n">any_expr</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">lambda_arg</span><span class="p">)</span>
</span><span id="L-986"><a href="#L-986"><span class="linenos"> 986</span></a> <span class="n">lambda_expr</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lambda</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">binop</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">lambda_arg</span><span class="p">])</span>
</span><span id="L-987"><a href="#L-987"><span class="linenos"> 987</span></a> <span class="n">binop</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">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="o">.</span><span class="n">unnest</span><span class="p">(),</span> <span class="n">expression</span><span class="o">=</span><span class="n">lambda_expr</span><span class="p">))</span>
</span><span id="L-988"><a href="#L-988"><span class="linenos"> 988</span></a>
</span><span id="L-989"><a href="#L-989"><span class="linenos"> 989</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-990"><a href="#L-990"><span class="linenos"> 990</span></a>
</span><span id="L-991"><a href="#L-991"><span class="linenos"> 991</span></a> <span class="n">window_expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-992"><a href="#L-992"><span class="linenos"> 992</span></a>
</span><span id="L-993"><a href="#L-993"><span class="linenos"> 993</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-994"><a href="#L-994"><span class="linenos"> 994</span></a> <span class="n">inherited_window</span> <span class="o">=</span> <span class="n">window_expression</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
</span><span id="L-995"><a href="#L-995"><span class="linenos"> 995</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inherited_window</span><span class="p">:</span>
</span><span id="L-996"><a href="#L-996"><span class="linenos"> 996</span></a> <span class="k">return</span>
</span><span id="L-997"><a href="#L-997"><span class="linenos"> 997</span></a>
</span><span id="L-998"><a href="#L-998"><span class="linenos"> 998</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-999"><a href="#L-999"><span class="linenos"> 999</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;partition_by&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;spec&quot;</span><span class="p">):</span>
</span><span id="L-1000"><a href="#L-1000"><span class="linenos">1000</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="n">inherited_window</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><span id="L-1001"><a href="#L-1001"><span class="linenos">1001</span></a> <span class="k">if</span> <span class="n">arg</span><span class="p">:</span>
</span><span id="L-1002"><a href="#L-1002"><span class="linenos">1002</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-1003"><a href="#L-1003"><span class="linenos">1003</span></a>
</span><span id="L-1004"><a href="#L-1004"><span class="linenos">1004</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">windows</span><span class="p">:</span>
</span><span id="L-1005"><a href="#L-1005"><span class="linenos">1005</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="L-1006"><a href="#L-1006"><span class="linenos">1006</span></a> <span class="n">window_expression</span><span class="p">[</span><span class="n">window</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">window</span>
</span><span id="L-1007"><a href="#L-1007"><span class="linenos">1007</span></a>
</span><span id="L-1008"><a href="#L-1008"><span class="linenos">1008</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</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">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">):</span>
</span><span id="L-1009"><a href="#L-1009"><span class="linenos">1009</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="L-1010"><a href="#L-1010"><span class="linenos">1010</span></a>
</span><span id="L-1011"><a href="#L-1011"><span class="linenos">1011</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-991"><a href="#L-991"><span class="linenos"> 991</span></a>
</span><span id="L-992"><a href="#L-992"><span class="linenos"> 992</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_window_clause</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-993"><a href="#L-993"><span class="linenos"> 993</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Eliminates the `WINDOW` query clause by inling each named window.&quot;&quot;&quot;</span>
</span><span id="L-994"><a href="#L-994"><span class="linenos"> 994</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">):</span>
</span><span id="L-995"><a href="#L-995"><span class="linenos"> 995</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_all_in_scope</span>
</span><span id="L-996"><a href="#L-996"><span class="linenos"> 996</span></a>
</span><span id="L-997"><a href="#L-997"><span class="linenos"> 997</span></a> <span class="n">windows</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;windows&quot;</span><span class="p">]</span>
</span><span id="L-998"><a href="#L-998"><span class="linenos"> 998</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-999"><a href="#L-999"><span class="linenos"> 999</span></a>
</span><span id="L-1000"><a href="#L-1000"><span class="linenos">1000</span></a> <span class="n">window_expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-1001"><a href="#L-1001"><span class="linenos">1001</span></a>
</span><span id="L-1002"><a href="#L-1002"><span class="linenos">1002</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1003"><a href="#L-1003"><span class="linenos">1003</span></a> <span class="n">inherited_window</span> <span class="o">=</span> <span class="n">window_expression</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
</span><span id="L-1004"><a href="#L-1004"><span class="linenos">1004</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inherited_window</span><span class="p">:</span>
</span><span id="L-1005"><a href="#L-1005"><span class="linenos">1005</span></a> <span class="k">return</span>
</span><span id="L-1006"><a href="#L-1006"><span class="linenos">1006</span></a>
</span><span id="L-1007"><a href="#L-1007"><span class="linenos">1007</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-1008"><a href="#L-1008"><span class="linenos">1008</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;partition_by&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;spec&quot;</span><span class="p">):</span>
</span><span id="L-1009"><a href="#L-1009"><span class="linenos">1009</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="n">inherited_window</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><span id="L-1010"><a href="#L-1010"><span class="linenos">1010</span></a> <span class="k">if</span> <span class="n">arg</span><span class="p">:</span>
</span><span id="L-1011"><a href="#L-1011"><span class="linenos">1011</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-1012"><a href="#L-1012"><span class="linenos">1012</span></a>
</span><span id="L-1013"><a href="#L-1013"><span class="linenos">1013</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">windows</span><span class="p">:</span>
</span><span id="L-1014"><a href="#L-1014"><span class="linenos">1014</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="L-1015"><a href="#L-1015"><span class="linenos">1015</span></a> <span class="n">window_expression</span><span class="p">[</span><span class="n">window</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">window</span>
</span><span id="L-1016"><a href="#L-1016"><span class="linenos">1016</span></a>
</span><span id="L-1017"><a href="#L-1017"><span class="linenos">1017</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</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">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">):</span>
</span><span id="L-1018"><a href="#L-1018"><span class="linenos">1018</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="L-1019"><a href="#L-1019"><span class="linenos">1019</span></a>
</span><span id="L-1020"><a href="#L-1020"><span class="linenos">1020</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -2467,136 +2476,166 @@ The corresponding columns are removed from the create statement.</p>
</div>
<a class="headerlink" href="#eliminate_join_marks"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_join_marks-845"><a href="#eliminate_join_marks-845"><span class="linenos">845</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_join_marks</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_join_marks-846"><a href="#eliminate_join_marks-846"><span class="linenos">846</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_join_marks-847"><a href="#eliminate_join_marks-847"><span class="linenos">847</span></a><span class="sd"> Remove join marks from an AST. This rule assumes that all marked columns are qualified.</span>
</span><span id="eliminate_join_marks-848"><a href="#eliminate_join_marks-848"><span class="linenos">848</span></a><span class="sd"> If this does not hold for a query, consider running `sqlglot.optimizer.qualify` first.</span>
</span><span id="eliminate_join_marks-846"><a href="#eliminate_join_marks-846"><span class="linenos">846</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178</span>
</span><span id="eliminate_join_marks-847"><a href="#eliminate_join_marks-847"><span class="linenos">847</span></a>
</span><span id="eliminate_join_marks-848"><a href="#eliminate_join_marks-848"><span class="linenos">848</span></a><span class="sd"> 1. You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.</span>
</span><span id="eliminate_join_marks-849"><a href="#eliminate_join_marks-849"><span class="linenos">849</span></a>
</span><span id="eliminate_join_marks-850"><a href="#eliminate_join_marks-850"><span class="linenos">850</span></a><span class="sd"> For example,</span>
</span><span id="eliminate_join_marks-851"><a href="#eliminate_join_marks-851"><span class="linenos">851</span></a><span class="sd"> SELECT * FROM a, b WHERE a.id = b.id(+) -- ... is converted to</span>
</span><span id="eliminate_join_marks-852"><a href="#eliminate_join_marks-852"><span class="linenos">852</span></a><span class="sd"> SELECT * FROM a LEFT JOIN b ON a.id = b.id -- this</span>
</span><span id="eliminate_join_marks-850"><a href="#eliminate_join_marks-850"><span class="linenos">850</span></a><span class="sd"> 2. The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.</span>
</span><span id="eliminate_join_marks-851"><a href="#eliminate_join_marks-851"><span class="linenos">851</span></a>
</span><span id="eliminate_join_marks-852"><a href="#eliminate_join_marks-852"><span class="linenos">852</span></a><span class="sd"> The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.</span>
</span><span id="eliminate_join_marks-853"><a href="#eliminate_join_marks-853"><span class="linenos">853</span></a>
</span><span id="eliminate_join_marks-854"><a href="#eliminate_join_marks-854"><span class="linenos">854</span></a><span class="sd"> Args:</span>
</span><span id="eliminate_join_marks-855"><a href="#eliminate_join_marks-855"><span class="linenos">855</span></a><span class="sd"> expression: The AST to remove join marks from.</span>
</span><span id="eliminate_join_marks-856"><a href="#eliminate_join_marks-856"><span class="linenos">856</span></a>
</span><span id="eliminate_join_marks-857"><a href="#eliminate_join_marks-857"><span class="linenos">857</span></a><span class="sd"> Returns:</span>
</span><span id="eliminate_join_marks-858"><a href="#eliminate_join_marks-858"><span class="linenos">858</span></a><span class="sd"> The AST with join marks removed.</span>
</span><span id="eliminate_join_marks-859"><a href="#eliminate_join_marks-859"><span class="linenos">859</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_join_marks-860"><a href="#eliminate_join_marks-860"><span class="linenos">860</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">traverse_scope</span>
</span><span id="eliminate_join_marks-854"><a href="#eliminate_join_marks-854"><span class="linenos">854</span></a><span class="sd"> You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.</span>
</span><span id="eliminate_join_marks-855"><a href="#eliminate_join_marks-855"><span class="linenos">855</span></a>
</span><span id="eliminate_join_marks-856"><a href="#eliminate_join_marks-856"><span class="linenos">856</span></a><span class="sd"> The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.</span>
</span><span id="eliminate_join_marks-857"><a href="#eliminate_join_marks-857"><span class="linenos">857</span></a>
</span><span id="eliminate_join_marks-858"><a href="#eliminate_join_marks-858"><span class="linenos">858</span></a><span class="sd"> A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.</span>
</span><span id="eliminate_join_marks-859"><a href="#eliminate_join_marks-859"><span class="linenos">859</span></a>
</span><span id="eliminate_join_marks-860"><a href="#eliminate_join_marks-860"><span class="linenos">860</span></a><span class="sd"> A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.</span>
</span><span id="eliminate_join_marks-861"><a href="#eliminate_join_marks-861"><span class="linenos">861</span></a>
</span><span id="eliminate_join_marks-862"><a href="#eliminate_join_marks-862"><span class="linenos">862</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="eliminate_join_marks-863"><a href="#eliminate_join_marks-863"><span class="linenos">863</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="eliminate_join_marks-864"><a href="#eliminate_join_marks-864"><span class="linenos">864</span></a>
</span><span id="eliminate_join_marks-865"><a href="#eliminate_join_marks-865"><span class="linenos">865</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-866"><a href="#eliminate_join_marks-866"><span class="linenos">866</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-867"><a href="#eliminate_join_marks-867"><span class="linenos">867</span></a>
</span><span id="eliminate_join_marks-868"><a href="#eliminate_join_marks-868"><span class="linenos">868</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">joins</span><span class="p">:</span>
</span><span id="eliminate_join_marks-869"><a href="#eliminate_join_marks-869"><span class="linenos">869</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-870"><a href="#eliminate_join_marks-870"><span class="linenos">870</span></a>
</span><span id="eliminate_join_marks-871"><a href="#eliminate_join_marks-871"><span class="linenos">871</span></a> <span class="n">query_from</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span>
</span><span id="eliminate_join_marks-872"><a href="#eliminate_join_marks-872"><span class="linenos">872</span></a>
</span><span id="eliminate_join_marks-873"><a href="#eliminate_join_marks-873"><span class="linenos">873</span></a> <span class="c1"># These keep track of the joins to be replaced</span>
</span><span id="eliminate_join_marks-874"><a href="#eliminate_join_marks-874"><span class="linenos">874</span></a> <span class="n">new_joins</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="eliminate_join_marks-875"><a href="#eliminate_join_marks-875"><span class="linenos">875</span></a> <span class="n">old_joins</span> <span class="o">=</span> <span class="p">{</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">join</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">}</span>
</span><span id="eliminate_join_marks-862"><a href="#eliminate_join_marks-862"><span class="linenos">862</span></a><span class="sd"> A WHERE condition cannot compare any column marked with the (+) operator with a subquery.</span>
</span><span id="eliminate_join_marks-863"><a href="#eliminate_join_marks-863"><span class="linenos">863</span></a>
</span><span id="eliminate_join_marks-864"><a href="#eliminate_join_marks-864"><span class="linenos">864</span></a><span class="sd"> -- example with WHERE</span>
</span><span id="eliminate_join_marks-865"><a href="#eliminate_join_marks-865"><span class="linenos">865</span></a><span class="sd"> SELECT d.department_name, sum(e.salary) as total_salary</span>
</span><span id="eliminate_join_marks-866"><a href="#eliminate_join_marks-866"><span class="linenos">866</span></a><span class="sd"> FROM departments d, employees e</span>
</span><span id="eliminate_join_marks-867"><a href="#eliminate_join_marks-867"><span class="linenos">867</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id</span>
</span><span id="eliminate_join_marks-868"><a href="#eliminate_join_marks-868"><span class="linenos">868</span></a><span class="sd"> group by department_name</span>
</span><span id="eliminate_join_marks-869"><a href="#eliminate_join_marks-869"><span class="linenos">869</span></a>
</span><span id="eliminate_join_marks-870"><a href="#eliminate_join_marks-870"><span class="linenos">870</span></a><span class="sd"> -- example of left correlation in select</span>
</span><span id="eliminate_join_marks-871"><a href="#eliminate_join_marks-871"><span class="linenos">871</span></a><span class="sd"> SELECT d.department_name, (</span>
</span><span id="eliminate_join_marks-872"><a href="#eliminate_join_marks-872"><span class="linenos">872</span></a><span class="sd"> SELECT SUM(e.salary)</span>
</span><span id="eliminate_join_marks-873"><a href="#eliminate_join_marks-873"><span class="linenos">873</span></a><span class="sd"> FROM employees e</span>
</span><span id="eliminate_join_marks-874"><a href="#eliminate_join_marks-874"><span class="linenos">874</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id) AS total_salary</span>
</span><span id="eliminate_join_marks-875"><a href="#eliminate_join_marks-875"><span class="linenos">875</span></a><span class="sd"> FROM departments d;</span>
</span><span id="eliminate_join_marks-876"><a href="#eliminate_join_marks-876"><span class="linenos">876</span></a>
</span><span id="eliminate_join_marks-877"><a href="#eliminate_join_marks-877"><span class="linenos">877</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="eliminate_join_marks-878"><a href="#eliminate_join_marks-878"><span class="linenos">878</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">column</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">):</span>
</span><span id="eliminate_join_marks-879"><a href="#eliminate_join_marks-879"><span class="linenos">879</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-880"><a href="#eliminate_join_marks-880"><span class="linenos">880</span></a>
</span><span id="eliminate_join_marks-881"><a href="#eliminate_join_marks-881"><span class="linenos">881</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 class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="eliminate_join_marks-882"><a href="#eliminate_join_marks-882"><span class="linenos">882</span></a> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="eliminate_join_marks-883"><a href="#eliminate_join_marks-883"><span class="linenos">883</span></a> <span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span>
</span><span id="eliminate_join_marks-884"><a href="#eliminate_join_marks-884"><span class="linenos">884</span></a> <span class="p">),</span> <span class="s2">&quot;Columns can only be marked with (+) when involved in a binary operation&quot;</span>
</span><span id="eliminate_join_marks-877"><a href="#eliminate_join_marks-877"><span class="linenos">877</span></a><span class="sd"> -- example of left correlation in from</span>
</span><span id="eliminate_join_marks-878"><a href="#eliminate_join_marks-878"><span class="linenos">878</span></a><span class="sd"> SELECT d.department_name, t.total_salary</span>
</span><span id="eliminate_join_marks-879"><a href="#eliminate_join_marks-879"><span class="linenos">879</span></a><span class="sd"> FROM departments d, (</span>
</span><span id="eliminate_join_marks-880"><a href="#eliminate_join_marks-880"><span class="linenos">880</span></a><span class="sd"> SELECT SUM(e.salary) AS total_salary</span>
</span><span id="eliminate_join_marks-881"><a href="#eliminate_join_marks-881"><span class="linenos">881</span></a><span class="sd"> FROM employees e</span>
</span><span id="eliminate_join_marks-882"><a href="#eliminate_join_marks-882"><span class="linenos">882</span></a><span class="sd"> WHERE e.department_id(+) = d.department_id</span>
</span><span id="eliminate_join_marks-883"><a href="#eliminate_join_marks-883"><span class="linenos">883</span></a><span class="sd"> ) t</span>
</span><span id="eliminate_join_marks-884"><a href="#eliminate_join_marks-884"><span class="linenos">884</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_join_marks-885"><a href="#eliminate_join_marks-885"><span class="linenos">885</span></a>
</span><span id="eliminate_join_marks-886"><a href="#eliminate_join_marks-886"><span class="linenos">886</span></a> <span class="n">predicate_parent</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent</span>
</span><span id="eliminate_join_marks-887"><a href="#eliminate_join_marks-887"><span class="linenos">887</span></a> <span class="n">join_predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_join_marks-888"><a href="#eliminate_join_marks-888"><span class="linenos">888</span></a>
</span><span id="eliminate_join_marks-889"><a href="#eliminate_join_marks-889"><span class="linenos">889</span></a> <span class="n">left_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="eliminate_join_marks-890"><a href="#eliminate_join_marks-890"><span class="linenos">890</span></a> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">join_predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-891"><a href="#eliminate_join_marks-891"><span class="linenos">891</span></a> <span class="p">]</span>
</span><span id="eliminate_join_marks-892"><a href="#eliminate_join_marks-892"><span class="linenos">892</span></a> <span class="n">right_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="eliminate_join_marks-893"><a href="#eliminate_join_marks-893"><span class="linenos">893</span></a> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">join_predicate</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-894"><a href="#eliminate_join_marks-894"><span class="linenos">894</span></a> <span class="p">]</span>
</span><span id="eliminate_join_marks-895"><a href="#eliminate_join_marks-895"><span class="linenos">895</span></a>
</span><span id="eliminate_join_marks-896"><a href="#eliminate_join_marks-896"><span class="linenos">896</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-897"><a href="#eliminate_join_marks-897"><span class="linenos">897</span></a> <span class="n">left_columns</span> <span class="ow">and</span> <span class="n">right_columns</span>
</span><span id="eliminate_join_marks-898"><a href="#eliminate_join_marks-898"><span class="linenos">898</span></a> <span class="p">),</span> <span class="s2">&quot;The (+) marker cannot appear in both sides of a binary predicate&quot;</span>
</span><span id="eliminate_join_marks-886"><a href="#eliminate_join_marks-886"><span class="linenos">886</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">traverse_scope</span>
</span><span id="eliminate_join_marks-887"><a href="#eliminate_join_marks-887"><span class="linenos">887</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.normalize</span><span class="w"> </span><span class="kn">import</span> <span class="n">normalize</span><span class="p">,</span> <span class="n">normalized</span>
</span><span id="eliminate_join_marks-888"><a href="#eliminate_join_marks-888"><span class="linenos">888</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
</span><span id="eliminate_join_marks-889"><a href="#eliminate_join_marks-889"><span class="linenos">889</span></a>
</span><span id="eliminate_join_marks-890"><a href="#eliminate_join_marks-890"><span class="linenos">890</span></a> <span class="c1"># we go in reverse to check the main query for left correlation</span>
</span><span id="eliminate_join_marks-891"><a href="#eliminate_join_marks-891"><span class="linenos">891</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)):</span>
</span><span id="eliminate_join_marks-892"><a href="#eliminate_join_marks-892"><span class="linenos">892</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="eliminate_join_marks-893"><a href="#eliminate_join_marks-893"><span class="linenos">893</span></a>
</span><span id="eliminate_join_marks-894"><a href="#eliminate_join_marks-894"><span class="linenos">894</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-895"><a href="#eliminate_join_marks-895"><span class="linenos">895</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="p">[])</span>
</span><span id="eliminate_join_marks-896"><a href="#eliminate_join_marks-896"><span class="linenos">896</span></a>
</span><span id="eliminate_join_marks-897"><a href="#eliminate_join_marks-897"><span class="linenos">897</span></a> <span class="c1"># knockout: we do not support left correlation (see point 2)</span>
</span><span id="eliminate_join_marks-898"><a href="#eliminate_join_marks-898"><span class="linenos">898</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">is_correlated_subquery</span><span class="p">,</span> <span class="s2">&quot;Correlated queries are not supported&quot;</span>
</span><span id="eliminate_join_marks-899"><a href="#eliminate_join_marks-899"><span class="linenos">899</span></a>
</span><span id="eliminate_join_marks-900"><a href="#eliminate_join_marks-900"><span class="linenos">900</span></a> <span class="n">marked_column_tables</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
</span><span id="eliminate_join_marks-901"><a href="#eliminate_join_marks-901"><span class="linenos">901</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">left_columns</span> <span class="ow">or</span> <span class="n">right_columns</span><span class="p">:</span>
</span><span id="eliminate_join_marks-902"><a href="#eliminate_join_marks-902"><span class="linenos">902</span></a> <span class="n">table</span> <span class="o">=</span> <span class="n">col</span><span class="o">.</span><span class="n">table</span>
</span><span id="eliminate_join_marks-903"><a href="#eliminate_join_marks-903"><span class="linenos">903</span></a> <span class="k">assert</span> <span class="n">table</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;Column </span><span class="si">{</span><span class="n">col</span><span class="si">}</span><span class="s2"> needs to be qualified with a table&quot;</span>
</span><span id="eliminate_join_marks-904"><a href="#eliminate_join_marks-904"><span class="linenos">904</span></a>
</span><span id="eliminate_join_marks-905"><a href="#eliminate_join_marks-905"><span class="linenos">905</span></a> <span class="n">col</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_join_marks-906"><a href="#eliminate_join_marks-906"><span class="linenos">906</span></a> <span class="n">marked_column_tables</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
</span><span id="eliminate_join_marks-900"><a href="#eliminate_join_marks-900"><span class="linenos">900</span></a> <span class="c1"># nothing to do - we check it here after knockout above</span>
</span><span id="eliminate_join_marks-901"><a href="#eliminate_join_marks-901"><span class="linenos">901</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">where</span><span class="o">.</span><span class="n">find_all</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="eliminate_join_marks-902"><a href="#eliminate_join_marks-902"><span class="linenos">902</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-903"><a href="#eliminate_join_marks-903"><span class="linenos">903</span></a>
</span><span id="eliminate_join_marks-904"><a href="#eliminate_join_marks-904"><span class="linenos">904</span></a> <span class="c1"># make sure we have AND of ORs to have clear join terms</span>
</span><span id="eliminate_join_marks-905"><a href="#eliminate_join_marks-905"><span class="linenos">905</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="eliminate_join_marks-906"><a href="#eliminate_join_marks-906"><span class="linenos">906</span></a> <span class="k">assert</span> <span class="n">normalized</span><span class="p">(</span><span class="n">where</span><span class="p">),</span> <span class="s2">&quot;Cannot normalize JOIN predicates&quot;</span>
</span><span id="eliminate_join_marks-907"><a href="#eliminate_join_marks-907"><span class="linenos">907</span></a>
</span><span id="eliminate_join_marks-908"><a href="#eliminate_join_marks-908"><span class="linenos">908</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-909"><a href="#eliminate_join_marks-909"><span class="linenos">909</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">marked_column_tables</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
</span><span id="eliminate_join_marks-910"><a href="#eliminate_join_marks-910"><span class="linenos">910</span></a> <span class="p">),</span> <span class="s2">&quot;Columns of only a single table can be marked with (+) in a given binary predicate&quot;</span>
</span><span id="eliminate_join_marks-908"><a href="#eliminate_join_marks-908"><span class="linenos">908</span></a> <span class="n">joins_ons</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="c1"># dict of {name: list of join AND conditions}</span>
</span><span id="eliminate_join_marks-909"><a href="#eliminate_join_marks-909"><span class="linenos">909</span></a> <span class="k">for</span> <span class="n">cond</span> <span class="ow">in</span> <span class="p">[</span><span class="n">where</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">)</span> <span class="k">else</span> <span class="n">where</span><span class="o">.</span><span class="n">flatten</span><span class="p">():</span>
</span><span id="eliminate_join_marks-910"><a href="#eliminate_join_marks-910"><span class="linenos">910</span></a> <span class="n">join_cols</span> <span class="o">=</span> <span class="p">[</span><span class="n">col</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">cond</span><span class="o">.</span><span class="n">find_all</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="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">)]</span>
</span><span id="eliminate_join_marks-911"><a href="#eliminate_join_marks-911"><span class="linenos">911</span></a>
</span><span id="eliminate_join_marks-912"><a href="#eliminate_join_marks-912"><span class="linenos">912</span></a> <span class="c1"># Add predicate if join already copied, or add join if it is new</span>
</span><span id="eliminate_join_marks-913"><a href="#eliminate_join_marks-913"><span class="linenos">913</span></a> <span class="n">join_this</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">col</span><span class="o">.</span><span class="n">table</span><span class="p">,</span> <span class="n">query_from</span><span class="p">)</span><span class="o">.</span><span class="n">this</span>
</span><span id="eliminate_join_marks-914"><a href="#eliminate_join_marks-914"><span class="linenos">914</span></a> <span class="n">existing_join</span> <span class="o">=</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">join_this</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span>
</span><span id="eliminate_join_marks-915"><a href="#eliminate_join_marks-915"><span class="linenos">915</span></a> <span class="k">if</span> <span class="n">existing_join</span><span class="p">:</span>
</span><span id="eliminate_join_marks-916"><a href="#eliminate_join_marks-916"><span class="linenos">916</span></a> <span class="n">existing_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span><span class="n">existing_join</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">join_predicate</span><span class="p">))</span>
</span><span id="eliminate_join_marks-917"><a href="#eliminate_join_marks-917"><span class="linenos">917</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="eliminate_join_marks-918"><a href="#eliminate_join_marks-918"><span class="linenos">918</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">join_this</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span>
</span><span id="eliminate_join_marks-919"><a href="#eliminate_join_marks-919"><span class="linenos">919</span></a> <span class="n">this</span><span class="o">=</span><span class="n">join_this</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">on</span><span class="o">=</span><span class="n">join_predicate</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;LEFT&quot;</span>
</span><span id="eliminate_join_marks-920"><a href="#eliminate_join_marks-920"><span class="linenos">920</span></a> <span class="p">)</span>
</span><span id="eliminate_join_marks-921"><a href="#eliminate_join_marks-921"><span class="linenos">921</span></a>
</span><span id="eliminate_join_marks-922"><a href="#eliminate_join_marks-922"><span class="linenos">922</span></a> <span class="c1"># If the parent of the target predicate is a binary node, then it now has only one child</span>
</span><span id="eliminate_join_marks-923"><a href="#eliminate_join_marks-923"><span class="linenos">923</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate_parent</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="eliminate_join_marks-924"><a href="#eliminate_join_marks-924"><span class="linenos">924</span></a> <span class="k">if</span> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="eliminate_join_marks-925"><a href="#eliminate_join_marks-925"><span class="linenos">925</span></a> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">predicate_parent</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
</span><span id="eliminate_join_marks-926"><a href="#eliminate_join_marks-926"><span class="linenos">926</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="eliminate_join_marks-927"><a href="#eliminate_join_marks-927"><span class="linenos">927</span></a> <span class="n">predicate_parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">predicate_parent</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
</span><span id="eliminate_join_marks-912"><a href="#eliminate_join_marks-912"><span class="linenos">912</span></a> <span class="n">left_join_table</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">col</span><span class="o">.</span><span class="n">table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">join_cols</span><span class="p">)</span>
</span><span id="eliminate_join_marks-913"><a href="#eliminate_join_marks-913"><span class="linenos">913</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">left_join_table</span><span class="p">:</span>
</span><span id="eliminate_join_marks-914"><a href="#eliminate_join_marks-914"><span class="linenos">914</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-915"><a href="#eliminate_join_marks-915"><span class="linenos">915</span></a>
</span><span id="eliminate_join_marks-916"><a href="#eliminate_join_marks-916"><span class="linenos">916</span></a> <span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-917"><a href="#eliminate_join_marks-917"><span class="linenos">917</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">left_join_table</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="eliminate_join_marks-918"><a href="#eliminate_join_marks-918"><span class="linenos">918</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot combine JOIN predicates from different tables&quot;</span>
</span><span id="eliminate_join_marks-919"><a href="#eliminate_join_marks-919"><span class="linenos">919</span></a>
</span><span id="eliminate_join_marks-920"><a href="#eliminate_join_marks-920"><span class="linenos">920</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">join_cols</span><span class="p">:</span>
</span><span id="eliminate_join_marks-921"><a href="#eliminate_join_marks-921"><span class="linenos">921</span></a> <span class="n">col</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;join_mark&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_join_marks-922"><a href="#eliminate_join_marks-922"><span class="linenos">922</span></a>
</span><span id="eliminate_join_marks-923"><a href="#eliminate_join_marks-923"><span class="linenos">923</span></a> <span class="n">joins_ons</span><span class="p">[</span><span class="n">left_join_table</span><span class="o">.</span><span class="n">pop</span><span class="p">()]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cond</span><span class="p">)</span>
</span><span id="eliminate_join_marks-924"><a href="#eliminate_join_marks-924"><span class="linenos">924</span></a>
</span><span id="eliminate_join_marks-925"><a href="#eliminate_join_marks-925"><span class="linenos">925</span></a> <span class="n">old_joins</span> <span class="o">=</span> <span class="p">{</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">join</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">}</span>
</span><span id="eliminate_join_marks-926"><a href="#eliminate_join_marks-926"><span class="linenos">926</span></a> <span class="n">new_joins</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="eliminate_join_marks-927"><a href="#eliminate_join_marks-927"><span class="linenos">927</span></a> <span class="n">query_from</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span>
</span><span id="eliminate_join_marks-928"><a href="#eliminate_join_marks-928"><span class="linenos">928</span></a>
</span><span id="eliminate_join_marks-929"><a href="#eliminate_join_marks-929"><span class="linenos">929</span></a> <span class="n">only_old_join_sources</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="o">-</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</span><span id="eliminate_join_marks-930"><a href="#eliminate_join_marks-930"><span class="linenos">930</span></a>
</span><span id="eliminate_join_marks-931"><a href="#eliminate_join_marks-931"><span class="linenos">931</span></a> <span class="k">if</span> <span class="n">query_from</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">in</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="eliminate_join_marks-932"><a href="#eliminate_join_marks-932"><span class="linenos">932</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-933"><a href="#eliminate_join_marks-933"><span class="linenos">933</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">only_old_join_sources</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span>
</span><span id="eliminate_join_marks-934"><a href="#eliminate_join_marks-934"><span class="linenos">934</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot determine which table to use in the new FROM clause&quot;</span>
</span><span id="eliminate_join_marks-935"><a href="#eliminate_join_marks-935"><span class="linenos">935</span></a>
</span><span id="eliminate_join_marks-936"><a href="#eliminate_join_marks-936"><span class="linenos">936</span></a> <span class="n">new_from_name</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">only_old_join_sources</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="eliminate_join_marks-937"><a href="#eliminate_join_marks-937"><span class="linenos">937</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;from&quot;</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">this</span><span class="o">=</span><span class="n">old_joins</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">new_from_name</span><span class="p">)</span><span class="o">.</span><span class="n">this</span><span class="p">))</span>
</span><span id="eliminate_join_marks-938"><a href="#eliminate_join_marks-938"><span class="linenos">938</span></a> <span class="n">only_old_join_sources</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">new_from_name</span><span class="p">)</span>
</span><span id="eliminate_join_marks-939"><a href="#eliminate_join_marks-939"><span class="linenos">939</span></a>
</span><span id="eliminate_join_marks-940"><a href="#eliminate_join_marks-940"><span class="linenos">940</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="eliminate_join_marks-941"><a href="#eliminate_join_marks-941"><span class="linenos">941</span></a> <span class="n">only_old_join_expressions</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="eliminate_join_marks-942"><a href="#eliminate_join_marks-942"><span class="linenos">942</span></a> <span class="k">for</span> <span class="n">old_join_source</span> <span class="ow">in</span> <span class="n">only_old_join_sources</span><span class="p">:</span>
</span><span id="eliminate_join_marks-943"><a href="#eliminate_join_marks-943"><span class="linenos">943</span></a> <span class="n">old_join_expression</span> <span class="o">=</span> <span class="n">old_joins</span><span class="p">[</span><span class="n">old_join_source</span><span class="p">]</span>
</span><span id="eliminate_join_marks-944"><a href="#eliminate_join_marks-944"><span class="linenos">944</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">old_join_expression</span><span class="o">.</span><span class="n">kind</span><span class="p">:</span>
</span><span id="eliminate_join_marks-945"><a href="#eliminate_join_marks-945"><span class="linenos">945</span></a> <span class="n">old_join_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-946"><a href="#eliminate_join_marks-946"><span class="linenos">946</span></a>
</span><span id="eliminate_join_marks-947"><a href="#eliminate_join_marks-947"><span class="linenos">947</span></a> <span class="n">only_old_join_expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">old_join_expression</span><span class="p">)</span>
</span><span id="eliminate_join_marks-948"><a href="#eliminate_join_marks-948"><span class="linenos">948</span></a>
</span><span id="eliminate_join_marks-949"><a href="#eliminate_join_marks-949"><span class="linenos">949</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_joins</span><span class="o">.</span><span class="n">values</span><span class="p">())</span> <span class="o">+</span> <span class="n">only_old_join_expressions</span><span class="p">)</span>
</span><span id="eliminate_join_marks-950"><a href="#eliminate_join_marks-950"><span class="linenos">950</span></a>
</span><span id="eliminate_join_marks-951"><a href="#eliminate_join_marks-951"><span class="linenos">951</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
</span><span id="eliminate_join_marks-952"><a href="#eliminate_join_marks-952"><span class="linenos">952</span></a> <span class="n">where</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_join_marks-953"><a href="#eliminate_join_marks-953"><span class="linenos">953</span></a>
</span><span id="eliminate_join_marks-954"><a href="#eliminate_join_marks-954"><span class="linenos">954</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="eliminate_join_marks-929"><a href="#eliminate_join_marks-929"><span class="linenos">929</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">predicates</span> <span class="ow">in</span> <span class="n">joins_ons</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="eliminate_join_marks-930"><a href="#eliminate_join_marks-930"><span class="linenos">930</span></a> <span class="n">join_what</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">query_from</span><span class="p">)</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="eliminate_join_marks-931"><a href="#eliminate_join_marks-931"><span class="linenos">931</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">join_what</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span>
</span><span id="eliminate_join_marks-932"><a href="#eliminate_join_marks-932"><span class="linenos">932</span></a> <span class="n">this</span><span class="o">=</span><span class="n">join_what</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span><span class="o">*</span><span class="n">predicates</span><span class="p">),</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;LEFT&quot;</span>
</span><span id="eliminate_join_marks-933"><a href="#eliminate_join_marks-933"><span class="linenos">933</span></a> <span class="p">)</span>
</span><span id="eliminate_join_marks-934"><a href="#eliminate_join_marks-934"><span class="linenos">934</span></a>
</span><span id="eliminate_join_marks-935"><a href="#eliminate_join_marks-935"><span class="linenos">935</span></a> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">predicates</span><span class="p">:</span>
</span><span id="eliminate_join_marks-936"><a href="#eliminate_join_marks-936"><span class="linenos">936</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</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">Paren</span><span class="p">):</span>
</span><span id="eliminate_join_marks-937"><a href="#eliminate_join_marks-937"><span class="linenos">937</span></a> <span class="n">p</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">p</span><span class="p">)</span>
</span><span id="eliminate_join_marks-938"><a href="#eliminate_join_marks-938"><span class="linenos">938</span></a>
</span><span id="eliminate_join_marks-939"><a href="#eliminate_join_marks-939"><span class="linenos">939</span></a> <span class="n">parent</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">parent</span>
</span><span id="eliminate_join_marks-940"><a href="#eliminate_join_marks-940"><span class="linenos">940</span></a> <span class="n">p</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_join_marks-941"><a href="#eliminate_join_marks-941"><span class="linenos">941</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</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="eliminate_join_marks-942"><a href="#eliminate_join_marks-942"><span class="linenos">942</span></a> <span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">right</span> <span class="k">if</span> <span class="n">parent</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">parent</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
</span><span id="eliminate_join_marks-943"><a href="#eliminate_join_marks-943"><span class="linenos">943</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="eliminate_join_marks-944"><a href="#eliminate_join_marks-944"><span class="linenos">944</span></a> <span class="n">parent</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_join_marks-945"><a href="#eliminate_join_marks-945"><span class="linenos">945</span></a>
</span><span id="eliminate_join_marks-946"><a href="#eliminate_join_marks-946"><span class="linenos">946</span></a> <span class="k">if</span> <span class="n">query_from</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">in</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="eliminate_join_marks-947"><a href="#eliminate_join_marks-947"><span class="linenos">947</span></a> <span class="n">only_old_joins</span> <span class="o">=</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="o">-</span> <span class="n">new_joins</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
</span><span id="eliminate_join_marks-948"><a href="#eliminate_join_marks-948"><span class="linenos">948</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-949"><a href="#eliminate_join_marks-949"><span class="linenos">949</span></a> <span class="nb">len</span><span class="p">(</span><span class="n">only_old_joins</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1</span>
</span><span id="eliminate_join_marks-950"><a href="#eliminate_join_marks-950"><span class="linenos">950</span></a> <span class="p">),</span> <span class="s2">&quot;Cannot determine which table to use in the new FROM clause&quot;</span>
</span><span id="eliminate_join_marks-951"><a href="#eliminate_join_marks-951"><span class="linenos">951</span></a>
</span><span id="eliminate_join_marks-952"><a href="#eliminate_join_marks-952"><span class="linenos">952</span></a> <span class="n">new_from_name</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">only_old_joins</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="eliminate_join_marks-953"><a href="#eliminate_join_marks-953"><span class="linenos">953</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;from&quot;</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">this</span><span class="o">=</span><span class="n">old_joins</span><span class="p">[</span><span class="n">new_from_name</span><span class="p">]</span><span class="o">.</span><span class="n">this</span><span class="p">))</span>
</span><span id="eliminate_join_marks-954"><a href="#eliminate_join_marks-954"><span class="linenos">954</span></a>
</span><span id="eliminate_join_marks-955"><a href="#eliminate_join_marks-955"><span class="linenos">955</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="eliminate_join_marks-956"><a href="#eliminate_join_marks-956"><span class="linenos">956</span></a> <span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">old_joins</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="c1"># preserve any other joins</span>
</span><span id="eliminate_join_marks-957"><a href="#eliminate_join_marks-957"><span class="linenos">957</span></a> <span class="k">if</span> <span class="n">n</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">new_joins</span> <span class="ow">and</span> <span class="n">n</span> <span class="o">!=</span> <span class="n">query</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
</span><span id="eliminate_join_marks-958"><a href="#eliminate_join_marks-958"><span class="linenos">958</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">j</span><span class="o">.</span><span class="n">kind</span><span class="p">:</span>
</span><span id="eliminate_join_marks-959"><a href="#eliminate_join_marks-959"><span class="linenos">959</span></a> <span class="n">j</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="eliminate_join_marks-960"><a href="#eliminate_join_marks-960"><span class="linenos">960</span></a> <span class="n">new_joins</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span>
</span><span id="eliminate_join_marks-961"><a href="#eliminate_join_marks-961"><span class="linenos">961</span></a> <span class="n">query</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_joins</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
</span><span id="eliminate_join_marks-962"><a href="#eliminate_join_marks-962"><span class="linenos">962</span></a>
</span><span id="eliminate_join_marks-963"><a href="#eliminate_join_marks-963"><span class="linenos">963</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Remove join marks from an AST. This rule assumes that all marked columns are qualified.
If this does not hold for a query, consider running <code><a href="optimizer/qualify.html">sqlglot.optimizer.qualify</a></code> first.</p>
<div class="docstring"><p><a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178">https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178</a></p>
<p>For example,
SELECT * FROM a, b WHERE a.id = b.id(+) -- ... is converted to
SELECT * FROM a LEFT JOIN b ON a.id = b.id -- this</p>
<ol>
<li><p>You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.</p></li>
<li><p>The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.</p></li>
</ol>
<h6 id="arguments">Arguments:</h6>
<p>The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.</p>
<ul>
<li><strong>expression:</strong> The AST to remove join marks from.</li>
</ul>
<p>You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.</p>
<h6 id="returns">Returns:</h6>
<p>The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.</p>
<blockquote>
<p>The AST with join marks removed.</p>
</blockquote>
<p>A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.</p>
<p>A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.</p>
<p>A WHERE condition cannot compare any column marked with the (+) operator with a subquery.</p>
<p>-- example with WHERE
SELECT d.department_name, sum(e.salary) as total_salary
FROM departments d, employees e
WHERE e.department_id(+) = d.department_id
group by department_name</p>
<p>-- example of left correlation in select
SELECT d.department_name, (
SELECT SUM(e.salary)
FROM employees e
WHERE e.department_id(+) = d.department_id) AS total_salary
FROM departments d;</p>
<p>-- example of left correlation in from
SELECT d.department_name, t.total_salary
FROM departments d, (
SELECT SUM(e.salary) AS total_salary
FROM employees e
WHERE e.department_id(+) = d.department_id
) t</p>
</div>
@ -2612,31 +2651,31 @@ If this does not hold for a query, consider running <code><a href="optimizer/qua
</div>
<a class="headerlink" href="#any_to_exists"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="any_to_exists-957"><a href="#any_to_exists-957"><span class="linenos">957</span></a><span class="k">def</span><span class="w"> </span><span class="nf">any_to_exists</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="any_to_exists-958"><a href="#any_to_exists-958"><span class="linenos">958</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="any_to_exists-959"><a href="#any_to_exists-959"><span class="linenos">959</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</span>
</span><span id="any_to_exists-960"><a href="#any_to_exists-960"><span class="linenos">960</span></a>
</span><span id="any_to_exists-961"><a href="#any_to_exists-961"><span class="linenos">961</span></a><span class="sd"> For example,</span>
</span><span id="any_to_exists-962"><a href="#any_to_exists-962"><span class="linenos">962</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="any_to_exists-963"><a href="#any_to_exists-963"><span class="linenos">963</span></a><span class="sd"> - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -&gt; x &lt; 5)</span>
</span><span id="any_to_exists-964"><a href="#any_to_exists-964"><span class="linenos">964</span></a>
</span><span id="any_to_exists-965"><a href="#any_to_exists-965"><span class="linenos">965</span></a><span class="sd"> Both ANY and EXISTS accept queries but currently only array expressions are supported for this</span>
</span><span id="any_to_exists-966"><a href="#any_to_exists-966"><span class="linenos">966</span></a><span class="sd"> transformation</span>
</span><span id="any_to_exists-967"><a href="#any_to_exists-967"><span class="linenos">967</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="any_to_exists-968"><a href="#any_to_exists-968"><span class="linenos">968</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
</span><span id="any_to_exists-969"><a href="#any_to_exists-969"><span class="linenos">969</span></a> <span class="k">for</span> <span class="n">any_expr</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</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="any_to_exists-970"><a href="#any_to_exists-970"><span class="linenos">970</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">this</span>
</span><span id="any_to_exists-971"><a href="#any_to_exists-971"><span class="linenos">971</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
</span><span id="any_to_exists-972"><a href="#any_to_exists-972"><span class="linenos">972</span></a> <span class="k">continue</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="any_to_exists-966"><a href="#any_to_exists-966"><span class="linenos">966</span></a><span class="k">def</span><span class="w"> </span><span class="nf">any_to_exists</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="any_to_exists-967"><a href="#any_to_exists-967"><span class="linenos">967</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="any_to_exists-968"><a href="#any_to_exists-968"><span class="linenos">968</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</span>
</span><span id="any_to_exists-969"><a href="#any_to_exists-969"><span class="linenos">969</span></a>
</span><span id="any_to_exists-970"><a href="#any_to_exists-970"><span class="linenos">970</span></a><span class="sd"> For example,</span>
</span><span id="any_to_exists-971"><a href="#any_to_exists-971"><span class="linenos">971</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="any_to_exists-972"><a href="#any_to_exists-972"><span class="linenos">972</span></a><span class="sd"> - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -&gt; x &lt; 5)</span>
</span><span id="any_to_exists-973"><a href="#any_to_exists-973"><span class="linenos">973</span></a>
</span><span id="any_to_exists-974"><a href="#any_to_exists-974"><span class="linenos">974</span></a> <span class="n">binop</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">parent</span>
</span><span id="any_to_exists-975"><a href="#any_to_exists-975"><span class="linenos">975</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">binop</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="any_to_exists-976"><a href="#any_to_exists-976"><span class="linenos">976</span></a> <span class="n">lambda_arg</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="s2">&quot;x&quot;</span><span class="p">)</span>
</span><span id="any_to_exists-977"><a href="#any_to_exists-977"><span class="linenos">977</span></a> <span class="n">any_expr</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">lambda_arg</span><span class="p">)</span>
</span><span id="any_to_exists-978"><a href="#any_to_exists-978"><span class="linenos">978</span></a> <span class="n">lambda_expr</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lambda</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">binop</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">lambda_arg</span><span class="p">])</span>
</span><span id="any_to_exists-979"><a href="#any_to_exists-979"><span class="linenos">979</span></a> <span class="n">binop</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">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="o">.</span><span class="n">unnest</span><span class="p">(),</span> <span class="n">expression</span><span class="o">=</span><span class="n">lambda_expr</span><span class="p">))</span>
</span><span id="any_to_exists-980"><a href="#any_to_exists-980"><span class="linenos">980</span></a>
</span><span id="any_to_exists-981"><a href="#any_to_exists-981"><span class="linenos">981</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="any_to_exists-974"><a href="#any_to_exists-974"><span class="linenos">974</span></a><span class="sd"> Both ANY and EXISTS accept queries but currently only array expressions are supported for this</span>
</span><span id="any_to_exists-975"><a href="#any_to_exists-975"><span class="linenos">975</span></a><span class="sd"> transformation</span>
</span><span id="any_to_exists-976"><a href="#any_to_exists-976"><span class="linenos">976</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="any_to_exists-977"><a href="#any_to_exists-977"><span class="linenos">977</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
</span><span id="any_to_exists-978"><a href="#any_to_exists-978"><span class="linenos">978</span></a> <span class="k">for</span> <span class="n">any_expr</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</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="any_to_exists-979"><a href="#any_to_exists-979"><span class="linenos">979</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">this</span>
</span><span id="any_to_exists-980"><a href="#any_to_exists-980"><span class="linenos">980</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
</span><span id="any_to_exists-981"><a href="#any_to_exists-981"><span class="linenos">981</span></a> <span class="k">continue</span>
</span><span id="any_to_exists-982"><a href="#any_to_exists-982"><span class="linenos">982</span></a>
</span><span id="any_to_exists-983"><a href="#any_to_exists-983"><span class="linenos">983</span></a> <span class="n">binop</span> <span class="o">=</span> <span class="n">any_expr</span><span class="o">.</span><span class="n">parent</span>
</span><span id="any_to_exists-984"><a href="#any_to_exists-984"><span class="linenos">984</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">binop</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="any_to_exists-985"><a href="#any_to_exists-985"><span class="linenos">985</span></a> <span class="n">lambda_arg</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="s2">&quot;x&quot;</span><span class="p">)</span>
</span><span id="any_to_exists-986"><a href="#any_to_exists-986"><span class="linenos">986</span></a> <span class="n">any_expr</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">lambda_arg</span><span class="p">)</span>
</span><span id="any_to_exists-987"><a href="#any_to_exists-987"><span class="linenos">987</span></a> <span class="n">lambda_expr</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lambda</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">binop</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">lambda_arg</span><span class="p">])</span>
</span><span id="any_to_exists-988"><a href="#any_to_exists-988"><span class="linenos">988</span></a> <span class="n">binop</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">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="o">.</span><span class="n">unnest</span><span class="p">(),</span> <span class="n">expression</span><span class="o">=</span><span class="n">lambda_expr</span><span class="p">))</span>
</span><span id="any_to_exists-989"><a href="#any_to_exists-989"><span class="linenos">989</span></a>
</span><span id="any_to_exists-990"><a href="#any_to_exists-990"><span class="linenos">990</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -2663,35 +2702,35 @@ transformation</p>
</div>
<a class="headerlink" href="#eliminate_window_clause"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_window_clause-984"><a href="#eliminate_window_clause-984"><span class="linenos"> 984</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_window_clause</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_window_clause-985"><a href="#eliminate_window_clause-985"><span class="linenos"> 985</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Eliminates the `WINDOW` query clause by inling each named window.&quot;&quot;&quot;</span>
</span><span id="eliminate_window_clause-986"><a href="#eliminate_window_clause-986"><span class="linenos"> 986</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">):</span>
</span><span id="eliminate_window_clause-987"><a href="#eliminate_window_clause-987"><span class="linenos"> 987</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_all_in_scope</span>
</span><span id="eliminate_window_clause-988"><a href="#eliminate_window_clause-988"><span class="linenos"> 988</span></a>
</span><span id="eliminate_window_clause-989"><a href="#eliminate_window_clause-989"><span class="linenos"> 989</span></a> <span class="n">windows</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;windows&quot;</span><span class="p">]</span>
</span><span id="eliminate_window_clause-990"><a href="#eliminate_window_clause-990"><span class="linenos"> 990</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="eliminate_window_clause-991"><a href="#eliminate_window_clause-991"><span class="linenos"> 991</span></a>
</span><span id="eliminate_window_clause-992"><a href="#eliminate_window_clause-992"><span class="linenos"> 992</span></a> <span class="n">window_expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="eliminate_window_clause-993"><a href="#eliminate_window_clause-993"><span class="linenos"> 993</span></a>
</span><span id="eliminate_window_clause-994"><a href="#eliminate_window_clause-994"><span class="linenos"> 994</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="eliminate_window_clause-995"><a href="#eliminate_window_clause-995"><span class="linenos"> 995</span></a> <span class="n">inherited_window</span> <span class="o">=</span> <span class="n">window_expression</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
</span><span id="eliminate_window_clause-996"><a href="#eliminate_window_clause-996"><span class="linenos"> 996</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inherited_window</span><span class="p">:</span>
</span><span id="eliminate_window_clause-997"><a href="#eliminate_window_clause-997"><span class="linenos"> 997</span></a> <span class="k">return</span>
</span><span id="eliminate_window_clause-998"><a href="#eliminate_window_clause-998"><span class="linenos"> 998</span></a>
</span><span id="eliminate_window_clause-999"><a href="#eliminate_window_clause-999"><span class="linenos"> 999</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1000"><a href="#eliminate_window_clause-1000"><span class="linenos">1000</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;partition_by&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;spec&quot;</span><span class="p">):</span>
</span><span id="eliminate_window_clause-1001"><a href="#eliminate_window_clause-1001"><span class="linenos">1001</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="n">inherited_window</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><span id="eliminate_window_clause-1002"><a href="#eliminate_window_clause-1002"><span class="linenos">1002</span></a> <span class="k">if</span> <span class="n">arg</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1003"><a href="#eliminate_window_clause-1003"><span class="linenos">1003</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="eliminate_window_clause-1004"><a href="#eliminate_window_clause-1004"><span class="linenos">1004</span></a>
</span><span id="eliminate_window_clause-1005"><a href="#eliminate_window_clause-1005"><span class="linenos">1005</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">windows</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1006"><a href="#eliminate_window_clause-1006"><span class="linenos">1006</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1007"><a href="#eliminate_window_clause-1007"><span class="linenos">1007</span></a> <span class="n">window_expression</span><span class="p">[</span><span class="n">window</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">window</span>
</span><span id="eliminate_window_clause-1008"><a href="#eliminate_window_clause-1008"><span class="linenos">1008</span></a>
</span><span id="eliminate_window_clause-1009"><a href="#eliminate_window_clause-1009"><span class="linenos">1009</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</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">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">):</span>
</span><span id="eliminate_window_clause-1010"><a href="#eliminate_window_clause-1010"><span class="linenos">1010</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1011"><a href="#eliminate_window_clause-1011"><span class="linenos">1011</span></a>
</span><span id="eliminate_window_clause-1012"><a href="#eliminate_window_clause-1012"><span class="linenos">1012</span></a> <span class="k">return</span> <span class="n">expression</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_window_clause-993"><a href="#eliminate_window_clause-993"><span class="linenos"> 993</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_window_clause</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_window_clause-994"><a href="#eliminate_window_clause-994"><span class="linenos"> 994</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Eliminates the `WINDOW` query clause by inling each named window.&quot;&quot;&quot;</span>
</span><span id="eliminate_window_clause-995"><a href="#eliminate_window_clause-995"><span class="linenos"> 995</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">):</span>
</span><span id="eliminate_window_clause-996"><a href="#eliminate_window_clause-996"><span class="linenos"> 996</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.scope</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_all_in_scope</span>
</span><span id="eliminate_window_clause-997"><a href="#eliminate_window_clause-997"><span class="linenos"> 997</span></a>
</span><span id="eliminate_window_clause-998"><a href="#eliminate_window_clause-998"><span class="linenos"> 998</span></a> <span class="n">windows</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;windows&quot;</span><span class="p">]</span>
</span><span id="eliminate_window_clause-999"><a href="#eliminate_window_clause-999"><span class="linenos"> 999</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1000"><a href="#eliminate_window_clause-1000"><span class="linenos">1000</span></a>
</span><span id="eliminate_window_clause-1001"><a href="#eliminate_window_clause-1001"><span class="linenos">1001</span></a> <span class="n">window_expression</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="eliminate_window_clause-1002"><a href="#eliminate_window_clause-1002"><span class="linenos">1002</span></a>
</span><span id="eliminate_window_clause-1003"><a href="#eliminate_window_clause-1003"><span class="linenos">1003</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1004"><a href="#eliminate_window_clause-1004"><span class="linenos">1004</span></a> <span class="n">inherited_window</span> <span class="o">=</span> <span class="n">window_expression</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">window</span><span class="o">.</span><span class="n">alias</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
</span><span id="eliminate_window_clause-1005"><a href="#eliminate_window_clause-1005"><span class="linenos">1005</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inherited_window</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1006"><a href="#eliminate_window_clause-1006"><span class="linenos">1006</span></a> <span class="k">return</span>
</span><span id="eliminate_window_clause-1007"><a href="#eliminate_window_clause-1007"><span class="linenos">1007</span></a>
</span><span id="eliminate_window_clause-1008"><a href="#eliminate_window_clause-1008"><span class="linenos">1008</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1009"><a href="#eliminate_window_clause-1009"><span class="linenos">1009</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;partition_by&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="s2">&quot;spec&quot;</span><span class="p">):</span>
</span><span id="eliminate_window_clause-1010"><a href="#eliminate_window_clause-1010"><span class="linenos">1010</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="n">inherited_window</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><span id="eliminate_window_clause-1011"><a href="#eliminate_window_clause-1011"><span class="linenos">1011</span></a> <span class="k">if</span> <span class="n">arg</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1012"><a href="#eliminate_window_clause-1012"><span class="linenos">1012</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="eliminate_window_clause-1013"><a href="#eliminate_window_clause-1013"><span class="linenos">1013</span></a>
</span><span id="eliminate_window_clause-1014"><a href="#eliminate_window_clause-1014"><span class="linenos">1014</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">windows</span><span class="p">:</span>
</span><span id="eliminate_window_clause-1015"><a href="#eliminate_window_clause-1015"><span class="linenos">1015</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1016"><a href="#eliminate_window_clause-1016"><span class="linenos">1016</span></a> <span class="n">window_expression</span><span class="p">[</span><span class="n">window</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">window</span>
</span><span id="eliminate_window_clause-1017"><a href="#eliminate_window_clause-1017"><span class="linenos">1017</span></a>
</span><span id="eliminate_window_clause-1018"><a href="#eliminate_window_clause-1018"><span class="linenos">1018</span></a> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</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">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">):</span>
</span><span id="eliminate_window_clause-1019"><a href="#eliminate_window_clause-1019"><span class="linenos">1019</span></a> <span class="n">_inline_inherited_window</span><span class="p">(</span><span class="n">window</span><span class="p">)</span>
</span><span id="eliminate_window_clause-1020"><a href="#eliminate_window_clause-1020"><span class="linenos">1020</span></a>
</span><span id="eliminate_window_clause-1021"><a href="#eliminate_window_clause-1021"><span class="linenos">1021</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.3"/>
<meta name="generator" content="pdoc 15.0.4"/>
<title>sqlglot.trie API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>

View file

@ -557,6 +557,7 @@ class Hive(Dialect):
exp.GenerateDateArray: sequence_sql,
exp.If: if_sql(),
exp.ILike: no_ilike_sql,
exp.IntDiv: lambda self, e: self.binary(e, "DIV"),
exp.IsNan: rename_func("ISNAN"),
exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression),
exp.JSONExtractScalar: lambda self, e: self.func(

View file

@ -489,6 +489,27 @@ class MySQL(Dialect):
VALUES_FOLLOWED_BY_PAREN = False
SUPPORTS_PARTITION_SELECTION = True
def _parse_generated_as_identity(
self,
) -> (
exp.GeneratedAsIdentityColumnConstraint
| exp.ComputedColumnConstraint
| exp.GeneratedAsRowColumnConstraint
):
this = super()._parse_generated_as_identity()
if self._match_texts(("STORED", "VIRTUAL")):
persisted = self._prev.text.upper() == "STORED"
if isinstance(this, exp.ComputedColumnConstraint):
this.set("persisted", persisted)
elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint):
this = self.expression(
exp.ComputedColumnConstraint, this=this.expression, persisted=persisted
)
return this
def _parse_primary_key_part(self) -> t.Optional[exp.Expression]:
this = self._parse_id_var()
if not self._match(TokenType.L_PAREN):
@ -1154,6 +1175,10 @@ class MySQL(Dialect):
"zerofill",
}
def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str:
persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL"
return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}"
def array_sql(self, expression: exp.Array) -> str:
self.unsupported("Arrays are not supported by MySQL")
return self.function_fallback_sql(expression)

View file

@ -512,6 +512,18 @@ class Postgres(Dialect):
return this
def _parse_user_defined_type(
self, identifier: exp.Identifier
) -> t.Optional[exp.Expression]:
udt_type: exp.Identifier | exp.Dot = identifier
while self._match(TokenType.DOT):
part = self._parse_id_var()
if part:
udt_type = exp.Dot(this=udt_type, expression=part)
return exp.DataType.build(udt_type, udt=True)
class Generator(generator.Generator):
SINGLE_STRING_INTERVAL = True
RENAME_TABLE_WITH_DB = False

View file

@ -863,8 +863,14 @@ class Snowflake(Dialect):
properties=self._parse_properties(),
)
def _parse_get(self) -> exp.Get | exp.Command:
def _parse_get(self) -> t.Optional[exp.Expression]:
start = self._prev
# If we detect GET( then we need to parse a function, not a statement
if self._match(TokenType.L_PAREN):
self._retreat(self._index - 2)
return self._parse_expression()
target = self._parse_location_path()
# Parse as command if unquoted file path
@ -1100,6 +1106,7 @@ class Snowflake(Dialect):
self, e, func_name="CHARINDEX", supports_position=True
),
exp.StrToDate: lambda self, e: self.func("DATE", e.this, self.format_time(e)),
exp.StringToArray: rename_func("STRTOK_TO_ARRAY"),
exp.Stuff: rename_func("INSERT"),
exp.StPoint: rename_func("ST_MAKEPOINT"),
exp.TimeAdd: date_delta_sql("TIMEADD"),

View file

@ -109,7 +109,9 @@ class SQLite(Dialect):
"DATETIME": lambda args: exp.Anonymous(this="DATETIME", expressions=args),
"TIME": lambda args: exp.Anonymous(this="TIME", expressions=args),
}
STRING_ALIASES = True
ALTER_RENAME_REQUIRES_COLUMN = False
def _parse_unique(self) -> exp.UniqueColumnConstraint:
# Do not consume more tokens if UNIQUE is used as a standalone constraint, e.g:

View file

@ -51,8 +51,8 @@ class _Expression(type):
def __new__(cls, clsname, bases, attrs):
klass = super().__new__(cls, clsname, bases, attrs)
# When an Expression class is created, its key is automatically set to be
# the lowercase version of the class' name.
# When an Expression class is created, its key is automatically set
# to be the lowercase version of the class' name.
klass.key = clsname.lower()
# This is so that docstrings are not inherited in pdoc
@ -1724,15 +1724,15 @@ class Column(Condition):
if self.args.get(part)
]
def to_dot(self) -> Dot | Identifier:
def to_dot(self, include_dots: bool = True) -> Dot | Identifier:
"""Converts the column into a dot expression."""
parts = self.parts
parent = self.parent
while parent:
if isinstance(parent, Dot):
if include_dots:
while isinstance(parent, Dot):
parts.append(parent.expression)
parent = parent.parent
parent = parent.parent
return Dot.build(deepcopy(parts)) if len(parts) > 1 else parts[0]
@ -4753,6 +4753,8 @@ class DataType(Expression):
if udt:
return DataType(this=DataType.Type.USERDEFINED, kind=dtype, **kwargs)
raise
elif isinstance(dtype, (Identifier, Dot)) and udt:
return DataType(this=DataType.Type.USERDEFINED, kind=dtype, **kwargs)
elif isinstance(dtype, DataType.Type):
data_type_exp = DataType(this=dtype)
elif isinstance(dtype, DataType):
@ -4794,9 +4796,6 @@ class DataType(Expression):
return False
DATA_TYPE = t.Union[str, DataType, DataType.Type]
# https://www.postgresql.org/docs/15/datatype-pseudo.html
class PseudoType(DataType):
arg_types = {"this": True}
@ -4926,6 +4925,10 @@ class AddConstraint(Expression):
arg_types = {"expressions": True}
class AddPartition(Expression):
arg_types = {"this": True, "exists": False}
class AttachOption(Expression):
arg_types = {"this": True, "expression": False}
@ -5026,6 +5029,9 @@ class Dot(Binary):
return parts
DATA_TYPE = t.Union[str, Identifier, Dot, DataType, DataType.Type]
class DPipe(Binary):
arg_types = {"this": True, "expression": True, "safe": False}
@ -5587,7 +5593,7 @@ class String(Func):
class StringToArray(Func):
arg_types = {"this": True, "expression": True, "null": False}
arg_types = {"this": True, "expression": False, "null": False}
_sql_names = ["STRING_TO_ARRAY", "SPLIT_BY_STRING", "STRTOK_TO_ARRAY"]

View file

@ -3498,6 +3498,10 @@ class Generator(metaclass=_Generator):
def addconstraint_sql(self, expression: exp.AddConstraint) -> str:
return f"ADD {self.expressions(expression)}"
def addpartition_sql(self, expression: exp.AddPartition) -> str:
exists = "IF NOT EXISTS " if expression.args.get("exists") else ""
return f"ADD {exists}{self.sql(expression.this)}"
def distinct_sql(self, expression: exp.Distinct) -> str:
this = self.expressions(expression, flat=True)

View file

@ -758,6 +758,8 @@ def _traverse_tables(scope):
expressions.extend(join.this for join in expression.args.get("joins") or [])
continue
child_scope = None
for child_scope in _traverse_scope(
scope.branch(
expression,
@ -775,8 +777,9 @@ def _traverse_tables(scope):
sources[expression.alias] = child_scope
# append the final child_scope yielded
scopes.append(child_scope)
scope.table_scopes.append(child_scope)
if child_scope:
scopes.append(child_scope)
scope.table_scopes.append(child_scope)
scope.sources.update(sources)

View file

@ -932,11 +932,14 @@ class Parser(metaclass=_Parser):
PIPE_SYNTAX_TRANSFORM_PARSERS = {
"SELECT": lambda self, query: self._parse_pipe_syntax_select(query),
"WHERE": lambda self, query: self._parse_pipe_syntax_where(query),
"ORDER BY": lambda self, query: query.order_by(self._parse_order(), copy=False),
"WHERE": lambda self, query: query.where(self._parse_where(), copy=False),
"ORDER BY": lambda self, query: query.order_by(
self._parse_order(), append=False, copy=False
),
"LIMIT": lambda self, query: self._parse_pipe_syntax_limit(query),
"OFFSET": lambda self, query: query.offset(self._parse_offset(), copy=False),
"AGGREGATE": lambda self, query: self._parse_pipe_syntax_aggregate(query),
"PIVOT": lambda self, query: self._parse_pipe_syntax_pivot(query),
"UNPIVOT": lambda self, query: self._parse_pipe_syntax_pivot(query),
}
PROPERTY_PARSERS: t.Dict[str, t.Callable] = {
@ -1125,97 +1128,6 @@ class Parser(metaclass=_Parser):
"TRUNCATE": lambda self: self._parse_partitioned_by_bucket_or_truncate(),
}
def _parse_pipe_syntax_select(self, query: exp.Query) -> exp.Query:
select = self._parse_select()
if isinstance(select, exp.Select):
return select.from_(query.subquery(copy=False), copy=False)
return query
def _parse_pipe_syntax_where(self, query: exp.Query) -> exp.Query:
where = self._parse_where()
return query.where(where, copy=False)
def _parse_pipe_syntax_limit(self, query: exp.Query) -> exp.Query:
limit = self._parse_limit()
offset = self._parse_offset()
if limit:
query.limit(limit, copy=False)
if offset:
query.offset(offset, copy=False)
return query
def _parse_pipe_syntax_aggregate_fields(self) -> t.Optional[exp.Expression]:
this = self._parse_assignment()
if self._match_text_seq("GROUP", "AND", advance=False):
return this
this = self._parse_alias(this)
if self._match_set((TokenType.ASC, TokenType.DESC), advance=False):
return self._parse_ordered(lambda: this)
return this
def _parse_pipe_syntax_aggregate_group_order_by(
self, query: exp.Query, group_by_exists: bool = True
) -> exp.Query:
expr = self._parse_csv(self._parse_pipe_syntax_aggregate_fields)
aggregates_or_groups, orders = [], []
for element in expr:
if isinstance(element, exp.Ordered):
this = element.this
if isinstance(this, exp.Alias):
element.set("this", this.args["alias"])
orders.append(element)
else:
this = element
aggregates_or_groups.append(this)
if group_by_exists and isinstance(query, exp.Select):
query = query.select(*aggregates_or_groups, copy=False).group_by(
*[element.args.get("alias", element) for element in aggregates_or_groups],
copy=False,
)
else:
query = exp.select(*aggregates_or_groups, copy=False).from_(
query.subquery(copy=False), copy=False
)
if orders:
return query.order_by(*orders, copy=False)
return query
def _parse_pipe_syntax_aggregate(self, query: exp.Query) -> exp.Query:
self._match_text_seq("AGGREGATE")
query = self._parse_pipe_syntax_aggregate_group_order_by(query, group_by_exists=False)
if self._match(TokenType.GROUP_BY) or (
self._match_text_seq("GROUP", "AND") and self._match(TokenType.ORDER_BY)
):
return self._parse_pipe_syntax_aggregate_group_order_by(query)
return query
def _parse_pipe_syntax_set_operator(
self, query: t.Optional[exp.Query]
) -> t.Optional[exp.Query]:
first_setop = self.parse_set_operation(this=query)
if not first_setop or not query:
return None
first_setop.this.pop()
distinct = first_setop.args.pop("distinct")
setops = [first_setop.expression.pop(), *self._parse_expressions()]
if isinstance(first_setop, exp.Union):
return query.union(*setops, distinct=distinct, **first_setop.args)
if isinstance(first_setop, exp.Except):
return query.except_(*setops, distinct=distinct, **first_setop.args)
return query.intersect(*setops, distinct=distinct, **first_setop.args)
def _parse_partitioned_by_bucket_or_truncate(self) -> exp.Expression:
klass = (
exp.PartitionedByBucket
@ -1596,6 +1508,9 @@ class Parser(metaclass=_Parser):
# Whether the 'AS' keyword is optional in the CTE definition syntax
OPTIONAL_ALIAS_TOKEN_CTE = True
# Whether renaming a column with an ALTER statement requires the presence of the COLUMN keyword
ALTER_RENAME_REQUIRES_COLUMN = True
__slots__ = (
"error_level",
"error_message_context",
@ -1609,6 +1524,7 @@ class Parser(metaclass=_Parser):
"_next",
"_prev",
"_prev_comments",
"_pipe_cte_counter",
)
# Autofilled
@ -1639,6 +1555,7 @@ class Parser(metaclass=_Parser):
self._next = None
self._prev = None
self._prev_comments = None
self._pipe_cte_counter = 0
def parse(
self, raw_tokens: t.List[Token], sql: t.Optional[str] = None
@ -3335,9 +3252,11 @@ class Parser(metaclass=_Parser):
elif self._match(TokenType.VALUES, advance=False):
this = self._parse_derived_table_values()
elif from_:
this = exp.select("*").from_(from_.this, copy=False)
if self._match(TokenType.PIPE_GT, advance=False):
return self._parse_pipe_syntax_query(this)
return self._parse_pipe_syntax_query(
exp.Select().from_(from_.this, append=False, copy=False)
)
this = exp.select("*").from_(from_.this, copy=False)
elif self._match(TokenType.SUMMARIZE):
table = self._match(TokenType.TABLE)
this = self._parse_select() or self._parse_string() or self._parse_table()
@ -5203,6 +5122,14 @@ class Parser(metaclass=_Parser):
exp.DataTypeParam, this=this, expression=self._parse_var(any_token=True)
)
def _parse_user_defined_type(self, identifier: exp.Identifier) -> t.Optional[exp.Expression]:
type_name = identifier.name
while self._match(TokenType.DOT):
type_name = f"{type_name}.{self._advance_any() and self._prev.text}"
return exp.DataType.build(type_name, udt=True)
def _parse_types(
self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True
) -> t.Optional[exp.Expression]:
@ -5224,12 +5151,7 @@ class Parser(metaclass=_Parser):
if tokens[0].token_type in self.TYPE_TOKENS:
self._prev = tokens[0]
elif self.dialect.SUPPORTS_USER_DEFINED_TYPES:
type_name = identifier.name
while self._match(TokenType.DOT):
type_name = f"{type_name}.{self._advance_any() and self._prev.text}"
this = exp.DataType.build(type_name, udt=True)
this = self._parse_user_defined_type(identifier)
else:
self._retreat(self._index - 1)
return None
@ -5587,18 +5509,12 @@ class Parser(metaclass=_Parser):
else:
field = self._parse_field(any_token=True, anonymous_func=True)
# Function calls can be qualified, e.g., x.y.FOO()
# This converts the final AST to a series of Dots leading to the function call
# https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-reference#function_call_rules
if isinstance(field, (exp.Func, exp.Window)) and this:
# BQ & snowflake allow function calls like x.y.count(...), SAFE.SUBSTR(...) etc
# https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-reference#function_call_rules
this = exp.replace_tree(
this,
lambda n: (
self.expression(exp.Dot, this=n.args.get("table"), expression=n.this)
if n.table
else n.this
)
if isinstance(n, exp.Column)
else n,
this = this.transform(
lambda n: n.to_dot(include_dots=False) if isinstance(n, exp.Column) else n
)
if op:
@ -5973,7 +5889,11 @@ class Parser(metaclass=_Parser):
constraints.append(
self.expression(
exp.ColumnConstraint,
kind=exp.ComputedColumnConstraint(this=self._parse_disjunction()),
kind=exp.ComputedColumnConstraint(
this=self._parse_disjunction(),
persisted=self._match_texts(("STORED", "VIRTUAL"))
and self._prev.text.upper() == "STORED",
),
)
)
@ -7236,23 +7156,6 @@ class Parser(metaclass=_Parser):
return this
def _parse_pipe_syntax_query(self, query: exp.Query) -> t.Optional[exp.Query]:
while self._match(TokenType.PIPE_GT):
start = self._curr
parser = self.PIPE_SYNTAX_TRANSFORM_PARSERS.get(self._curr.text.upper())
if not parser:
set_op_query = self._parse_pipe_syntax_set_operator(query)
if not set_op_query:
self._retreat(start)
self.raise_error(f"Unsupported pipe syntax operator: '{start.text.upper()}'.")
break
query = set_op_query
else:
query = parser(self, query)
return query
def _parse_wrapped_id_vars(self, optional: bool = False) -> t.List[exp.Expression]:
return self._parse_wrapped_csv(self._parse_id_var, optional=optional)
@ -7331,24 +7234,29 @@ class Parser(metaclass=_Parser):
self._match(TokenType.TABLE)
return self.expression(exp.Refresh, this=self._parse_string() or self._parse_table())
def _parse_add_column(self) -> t.Optional[exp.Expression]:
def _parse_add_column(self) -> t.Optional[exp.ColumnDef]:
if not self._prev.text.upper() == "ADD":
return None
start = self._index
self._match(TokenType.COLUMN)
exists_column = self._parse_exists(not_=True)
expression = self._parse_field_def()
if expression:
expression.set("exists", exists_column)
if not isinstance(expression, exp.ColumnDef):
self._retreat(start)
return None
# https://docs.databricks.com/delta/update-schema.html#explicitly-update-schema-to-add-columns
if self._match_texts(("FIRST", "AFTER")):
position = self._prev.text
column_position = self.expression(
exp.ColumnPosition, this=self._parse_column(), position=position
)
expression.set("position", column_position)
expression.set("exists", exists_column)
# https://docs.databricks.com/delta/update-schema.html#explicitly-update-schema-to-add-columns
if self._match_texts(("FIRST", "AFTER")):
position = self._prev.text
column_position = self.expression(
exp.ColumnPosition, this=self._parse_column(), position=position
)
expression.set("position", column_position)
return expression
@ -7365,13 +7273,24 @@ class Parser(metaclass=_Parser):
)
def _parse_alter_table_add(self) -> t.List[exp.Expression]:
def _parse_add_column_or_constraint():
def _parse_add_alteration() -> t.Optional[exp.Expression]:
self._match_text_seq("ADD")
if self._match_set(self.ADD_CONSTRAINT_TOKENS, advance=False):
return self.expression(
exp.AddConstraint, expressions=self._parse_csv(self._parse_constraint)
)
return self._parse_add_column()
column_def = self._parse_add_column()
if isinstance(column_def, exp.ColumnDef):
return column_def
exists = self._parse_exists(not_=True)
if self._match_pair(TokenType.PARTITION, TokenType.L_PAREN, advance=False):
return self.expression(
exp.AddPartition, exists=exists, this=self._parse_field(any_token=True)
)
return None
if not self.dialect.ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN or self._match_text_seq(
"COLUMNS"
@ -7380,7 +7299,7 @@ class Parser(metaclass=_Parser):
return ensure_list(schema) if schema else self._parse_csv(self._parse_field_def)
return self._parse_csv(_parse_add_column_or_constraint)
return self._parse_csv(_parse_add_alteration)
def _parse_alter_table_alter(self) -> t.Optional[exp.Expression]:
if self._match_texts(self.ALTER_ALTER_PARSERS):
@ -7458,7 +7377,7 @@ class Parser(metaclass=_Parser):
return self._parse_csv(self._parse_drop_column)
def _parse_alter_table_rename(self) -> t.Optional[exp.AlterRename | exp.RenameColumn]:
if self._match(TokenType.COLUMN):
if self._match(TokenType.COLUMN) or not self.ALTER_RENAME_REQUIRES_COLUMN:
exists = self._parse_exists()
old_column = self._parse_column()
to = self._match_text_seq("TO")
@ -8408,3 +8327,160 @@ class Parser(metaclass=_Parser):
expression = self.expression(exp.Identifier, this=token.text, **kwargs)
expression.update_positions(token)
return expression
def _build_pipe_cte(self, query: exp.Query, expressions: t.List[exp.Expression]) -> exp.Select:
if not query.selects:
query = query.select("*", copy=False)
self._pipe_cte_counter += 1
new_cte = f"__tmp{self._pipe_cte_counter}"
with_ = query.args.get("with")
ctes = with_.pop() if with_ else None
new_select = exp.select(*expressions, copy=False).from_(new_cte, copy=False)
if ctes:
new_select.set("with", ctes)
return new_select.with_(new_cte, as_=query, copy=False)
def _parse_pipe_syntax_select(self, query: exp.Select) -> exp.Select:
select = self._parse_select()
if not select:
return query
if not query.selects:
return self._build_pipe_cte(query.select(*select.expressions), [exp.Star()])
return self._build_pipe_cte(query, select.expressions)
def _parse_pipe_syntax_limit(self, query: exp.Select) -> exp.Select:
limit = self._parse_limit()
offset = self._parse_offset()
if limit:
curr_limit = query.args.get("limit", limit)
if curr_limit.expression.to_py() >= limit.expression.to_py():
query.limit(limit, copy=False)
if offset:
curr_offset = query.args.get("offset")
curr_offset = curr_offset.expression.to_py() if curr_offset else 0
query.offset(exp.Literal.number(curr_offset + offset.expression.to_py()), copy=False)
return query
def _parse_pipe_syntax_aggregate_fields(self) -> t.Optional[exp.Expression]:
this = self._parse_assignment()
if self._match_text_seq("GROUP", "AND", advance=False):
return this
this = self._parse_alias(this)
if self._match_set((TokenType.ASC, TokenType.DESC), advance=False):
return self._parse_ordered(lambda: this)
return this
def _parse_pipe_syntax_aggregate_group_order_by(
self, query: exp.Select, group_by_exists: bool = True
) -> exp.Select:
expr = self._parse_csv(self._parse_pipe_syntax_aggregate_fields)
aggregates_or_groups, orders = [], []
for element in expr:
if isinstance(element, exp.Ordered):
this = element.this
if isinstance(this, exp.Alias):
element.set("this", this.args["alias"])
orders.append(element)
else:
this = element
aggregates_or_groups.append(this)
if group_by_exists:
query = query.select(*aggregates_or_groups, copy=False).group_by(
*[projection.args.get("alias", projection) for projection in aggregates_or_groups],
copy=False,
)
else:
query = query.select(*aggregates_or_groups, copy=False)
if orders:
return query.order_by(*orders, append=False, copy=False)
return query
def _parse_pipe_syntax_aggregate(self, query: exp.Select) -> exp.Select:
self._match_text_seq("AGGREGATE")
query = self._parse_pipe_syntax_aggregate_group_order_by(query, group_by_exists=False)
if self._match(TokenType.GROUP_BY) or (
self._match_text_seq("GROUP", "AND") and self._match(TokenType.ORDER_BY)
):
query = self._parse_pipe_syntax_aggregate_group_order_by(query)
return self._build_pipe_cte(query, [exp.Star()])
def _parse_pipe_syntax_set_operator(
self, query: t.Optional[exp.Query]
) -> t.Optional[exp.Select]:
first_setop = self.parse_set_operation(this=query)
if not first_setop or not query:
return None
first_setop.this.pop()
distinct = first_setop.args.pop("distinct")
setops = [first_setop.expression.pop(), *self._parse_expressions()]
query = self._build_pipe_cte(query, [exp.Star()])
with_ = query.args.get("with")
ctes = with_.pop() if with_ else None
if isinstance(first_setop, exp.Union):
query = query.union(*setops, distinct=distinct, copy=False, **first_setop.args)
elif isinstance(first_setop, exp.Except):
query = query.except_(*setops, distinct=distinct, copy=False, **first_setop.args)
else:
query = query.intersect(*setops, distinct=distinct, copy=False, **first_setop.args)
query.set("with", ctes)
return self._build_pipe_cte(query, [exp.Star()])
def _parse_pipe_syntax_join(self, query: exp.Select) -> t.Optional[exp.Select]:
join = self._parse_join()
if not join:
return None
return query.join(join, copy=False)
def _parse_pipe_syntax_pivot(self, query: exp.Select) -> exp.Select:
pivots = self._parse_pivots()
if not pivots:
return query
from_ = query.args.get("from")
if from_:
from_.this.set("pivots", pivots)
return self._build_pipe_cte(query, [exp.Star()])
def _parse_pipe_syntax_query(self, query: exp.Select) -> t.Optional[exp.Select]:
while self._match(TokenType.PIPE_GT):
start = self._curr
parser = self.PIPE_SYNTAX_TRANSFORM_PARSERS.get(self._curr.text.upper())
if not parser:
parsed_query = self._parse_pipe_syntax_set_operator(
query
) or self._parse_pipe_syntax_join(query)
if not parsed_query:
self._retreat(start)
self.raise_error(f"Unsupported pipe syntax operator: '{start.text.upper()}'.")
break
query = parsed_query
else:
query = parser(self, query)
if query and not query.selects:
return query.select("*", copy=False)
return query

View file

@ -842,113 +842,122 @@ def struct_kv_to_alias(expression: exp.Expression) -> exp.Expression:
def eliminate_join_marks(expression: exp.Expression) -> exp.Expression:
"""https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178
1. You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.
2. The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.
The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.
You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.
The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.
A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.
A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.
A WHERE condition cannot compare any column marked with the (+) operator with a subquery.
-- example with WHERE
SELECT d.department_name, sum(e.salary) as total_salary
FROM departments d, employees e
WHERE e.department_id(+) = d.department_id
group by department_name
-- example of left correlation in select
SELECT d.department_name, (
SELECT SUM(e.salary)
FROM employees e
WHERE e.department_id(+) = d.department_id) AS total_salary
FROM departments d;
-- example of left correlation in from
SELECT d.department_name, t.total_salary
FROM departments d, (
SELECT SUM(e.salary) AS total_salary
FROM employees e
WHERE e.department_id(+) = d.department_id
) t
"""
Remove join marks from an AST. This rule assumes that all marked columns are qualified.
If this does not hold for a query, consider running `sqlglot.optimizer.qualify` first.
For example,
SELECT * FROM a, b WHERE a.id = b.id(+) -- ... is converted to
SELECT * FROM a LEFT JOIN b ON a.id = b.id -- this
Args:
expression: The AST to remove join marks from.
Returns:
The AST with join marks removed.
"""
from sqlglot.optimizer.scope import traverse_scope
from sqlglot.optimizer.normalize import normalize, normalized
from collections import defaultdict
for scope in traverse_scope(expression):
# we go in reverse to check the main query for left correlation
for scope in reversed(traverse_scope(expression)):
query = scope.expression
where = query.args.get("where")
joins = query.args.get("joins")
joins = query.args.get("joins", [])
if not where or not joins:
# knockout: we do not support left correlation (see point 2)
assert not scope.is_correlated_subquery, "Correlated queries are not supported"
# nothing to do - we check it here after knockout above
if not where or not any(c.args.get("join_mark") for c in where.find_all(exp.Column)):
continue
query_from = query.args["from"]
# make sure we have AND of ORs to have clear join terms
where = normalize(where.this)
assert normalized(where), "Cannot normalize JOIN predicates"
# These keep track of the joins to be replaced
new_joins: t.Dict[str, exp.Join] = {}
old_joins = {join.alias_or_name: join for join in joins}
joins_ons = defaultdict(list) # dict of {name: list of join AND conditions}
for cond in [where] if not isinstance(where, exp.And) else where.flatten():
join_cols = [col for col in cond.find_all(exp.Column) if col.args.get("join_mark")]
for column in scope.columns:
if not column.args.get("join_mark"):
left_join_table = set(col.table for col in join_cols)
if not left_join_table:
continue
predicate = column.find_ancestor(exp.Predicate, exp.Select)
assert isinstance(
predicate, exp.Binary
), "Columns can only be marked with (+) when involved in a binary operation"
predicate_parent = predicate.parent
join_predicate = predicate.pop()
left_columns = [
c for c in join_predicate.left.find_all(exp.Column) if c.args.get("join_mark")
]
right_columns = [
c for c in join_predicate.right.find_all(exp.Column) if c.args.get("join_mark")
]
assert not (
left_columns and right_columns
), "The (+) marker cannot appear in both sides of a binary predicate"
marked_column_tables = set()
for col in left_columns or right_columns:
table = col.table
assert table, f"Column {col} needs to be qualified with a table"
len(left_join_table) > 1
), "Cannot combine JOIN predicates from different tables"
for col in join_cols:
col.set("join_mark", False)
marked_column_tables.add(table)
assert (
len(marked_column_tables) == 1
), "Columns of only a single table can be marked with (+) in a given binary predicate"
joins_ons[left_join_table.pop()].append(cond)
# Add predicate if join already copied, or add join if it is new
join_this = old_joins.get(col.table, query_from).this
existing_join = new_joins.get(join_this.alias_or_name)
if existing_join:
existing_join.set("on", exp.and_(existing_join.args["on"], join_predicate))
else:
new_joins[join_this.alias_or_name] = exp.Join(
this=join_this.copy(), on=join_predicate.copy(), kind="LEFT"
)
old_joins = {join.alias_or_name: join for join in joins}
new_joins = {}
query_from = query.args["from"]
# If the parent of the target predicate is a binary node, then it now has only one child
if isinstance(predicate_parent, exp.Binary):
if predicate_parent.left is None:
predicate_parent.replace(predicate_parent.right)
else:
predicate_parent.replace(predicate_parent.left)
for table, predicates in joins_ons.items():
join_what = old_joins.get(table, query_from).this.copy()
new_joins[join_what.alias_or_name] = exp.Join(
this=join_what, on=exp.and_(*predicates), kind="LEFT"
)
only_old_join_sources = old_joins.keys() - new_joins.keys()
for p in predicates:
while isinstance(p.parent, exp.Paren):
p.parent.replace(p)
parent = p.parent
p.pop()
if isinstance(parent, exp.Binary):
parent.replace(parent.right if parent.left is None else parent.left)
elif isinstance(parent, exp.Where):
parent.pop()
if query_from.alias_or_name in new_joins:
only_old_joins = old_joins.keys() - new_joins.keys()
assert (
len(only_old_join_sources) >= 1
len(only_old_joins) >= 1
), "Cannot determine which table to use in the new FROM clause"
new_from_name = list(only_old_join_sources)[0]
query.set("from", exp.From(this=old_joins.pop(new_from_name).this))
only_old_join_sources.remove(new_from_name)
new_from_name = list(only_old_joins)[0]
query.set("from", exp.From(this=old_joins[new_from_name].this))
if new_joins:
only_old_join_expressions = []
for old_join_source in only_old_join_sources:
old_join_expression = old_joins[old_join_source]
if not old_join_expression.kind:
old_join_expression.set("kind", "CROSS")
only_old_join_expressions.append(old_join_expression)
query.set("joins", list(new_joins.values()) + only_old_join_expressions)
if not where.this:
where.pop()
for n, j in old_joins.items(): # preserve any other joins
if n not in new_joins and n != query.args["from"].name:
if not j.kind:
j.set("kind", "CROSS")
new_joins[n] = j
query.set("joins", list(new_joins.values()))
return expression

View file

@ -42,6 +42,7 @@ class TestBigQuery(Validator):
self.assertEqual(table.db, "x-0")
self.assertEqual(table.name, "_y")
self.validate_identity("SAFE.SUBSTR('foo', 0, -2)").assert_is(exp.Dot)
self.validate_identity("SELECT * FROM x-0.y")
self.assertEqual(exp.to_table("`a.b`.`c.d`", dialect="bigquery").sql(), '"a"."b"."c"."d"')
self.assertEqual(exp.to_table("`x`.`y.z`", dialect="bigquery").sql(), '"x"."y"."z"')

View file

@ -3504,141 +3504,3 @@ FROM subquery2""",
parse_one("SELECT 0xCC", read=read_dialect).sql(other_integer_dialects),
"SELECT 0xCC",
)
def test_pipe_syntax(self):
self.validate_identity("FROM x", "SELECT * FROM x")
self.validate_identity("FROM x |> SELECT x1, x2", "SELECT x1, x2 FROM (SELECT * FROM x)")
self.validate_identity(
"FROM x |> SELECT x1 as c1, x2 as c2",
"SELECT x1 AS c1, x2 AS c2 FROM (SELECT * FROM x)",
)
self.validate_identity(
"FROM x |> SELECT x1 + 1 as x1_a, x2 - 1 as x2_a |> WHERE x1_a > 1",
"SELECT x1 + 1 AS x1_a, x2 - 1 AS x2_a FROM (SELECT * FROM x) WHERE x1_a > 1",
)
self.validate_identity(
"FROM x |> SELECT x1 + 1 as x1_a, x2 - 1 as x2_a |> WHERE x1_a > 1 |> SELECT x2_a",
"SELECT x2_a FROM (SELECT x1 + 1 AS x1_a, x2 - 1 AS x2_a FROM (SELECT * FROM x) WHERE x1_a > 1)",
)
self.validate_identity(
"FROM x |> WHERE x1 > 0 OR x2 > 0 |> WHERE x3 > 1 AND x4 > 1 |> SELECT x1, x4",
"SELECT x1, x4 FROM (SELECT * FROM x WHERE (x1 > 0 OR x2 > 0) AND (x3 > 1 AND x4 > 1))",
)
self.validate_identity(
"FROM x |> WHERE x1 > 1 |> WHERE x2 > 2 |> SELECT x1 as gt1, x2 as gt2",
"SELECT x1 AS gt1, x2 AS gt2 FROM (SELECT * FROM x WHERE x1 > 1 AND x2 > 2)",
)
self.validate_identity(
"FROM x |> WHERE x1 > 1 AND x2 > 2 |> SELECT x1 as gt1, x2 as gt2 |> SELECT gt1 * 2 + gt2 * 2 AS gt2_2",
"SELECT gt1 * 2 + gt2 * 2 AS gt2_2 FROM (SELECT x1 AS gt1, x2 AS gt2 FROM (SELECT * FROM x WHERE x1 > 1 AND x2 > 2))",
)
self.validate_identity("FROM x |> ORDER BY x1", "SELECT * FROM x ORDER BY x1")
self.validate_identity(
"FROM x |> ORDER BY x1 |> ORDER BY x2", "SELECT * FROM x ORDER BY x1, x2"
)
self.validate_identity(
"FROM x |> ORDER BY x1 |> WHERE x1 > 0 OR x1 != 1 |> ORDER BY x2 |> WHERE x2 > 0 AND x2 != 1 |> SELECT x1, x2",
"SELECT x1, x2 FROM (SELECT * FROM x WHERE (x1 > 0 OR x1 <> 1) AND (x2 > 0 AND x2 <> 1) ORDER BY x1, x2)",
)
self.validate_identity(
"FROM x |> ORDER BY x1 |> WHERE x1 > 0 |> SELECT x1",
"SELECT x1 FROM (SELECT * FROM x WHERE x1 > 0 ORDER BY x1)",
)
self.validate_identity(
"FROM x |> WHERE x1 > 0 |> SELECT x1 |> ORDER BY x1",
"SELECT x1 FROM (SELECT * FROM x WHERE x1 > 0) ORDER BY x1",
)
self.validate_identity(
"FROM x |> SELECT x1, x2, x3 |> ORDER BY x1 DESC NULLS FIRST, x2 ASC NULLS LAST, x3",
"SELECT x1, x2, x3 FROM (SELECT * FROM x) ORDER BY x1 DESC NULLS FIRST, x2 ASC NULLS LAST, x3",
)
for option in ("LIMIT 1", "OFFSET 2", "LIMIT 1 OFFSET 2"):
with self.subTest(f"Testing pipe syntax LIMIT and OFFSET option: {option}"):
self.validate_identity(f"FROM x |> {option}", f"SELECT * FROM x {option}")
self.validate_identity(f"FROM x |> {option}", f"SELECT * FROM x {option}")
self.validate_identity(
f"FROM x |> {option} |> SELECT x1, x2 |> WHERE x1 > 0 |> WHERE x2 > 0 |> ORDER BY x1, x2 ",
f"SELECT x1, x2 FROM (SELECT * FROM x {option}) WHERE x1 > 0 AND x2 > 0 ORDER BY x1, x2",
)
self.validate_identity(
f"FROM x |> SELECT x1, x2 |> WHERE x1 > 0 |> WHERE x2 > 0 |> ORDER BY x1, x2 |> {option}",
f"SELECT x1, x2 FROM (SELECT * FROM x) WHERE x1 > 0 AND x2 > 0 ORDER BY x1, x2 {option}",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3)",
"SELECT SUM(x1), MAX(x2), MIN(x3) FROM (SELECT * FROM x)",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) AS s_x1 |> SELECT s_x1",
"SELECT s_x1 FROM (SELECT SUM(x1) AS s_x1 FROM (SELECT * FROM x))",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3) GROUP BY x4, x5",
"SELECT SUM(x1), MAX(x2), MIN(x3), x4, x5 FROM (SELECT * FROM x) GROUP BY x4, x5",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3) GROUP BY x4 AS a_x4, x5 AS a_x5",
"SELECT SUM(x1), MAX(x2), MIN(x3), x4 AS a_x4, x5 AS a_x5 FROM (SELECT * FROM x) GROUP BY a_x4, a_x5",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) as s_x1 GROUP BY x1 |> SELECT s_x1, x1 as ss_x1",
"SELECT s_x1, x1 AS ss_x1 FROM (SELECT SUM(x1) AS s_x1, x1 FROM (SELECT * FROM x) GROUP BY x1)",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) GROUP", "SELECT SUM(x1) AS GROUP FROM (SELECT * FROM x)"
)
for order_option in ("ASC", "DESC", "ASC NULLS LAST", "DESC NULLS FIRST"):
with self.subTest(f"Testing pipe syntax AGGREGATE for order option: {order_option}"):
self.validate_all(
f"SELECT SUM(x1) AS x_s FROM (SELECT * FROM x) ORDER BY x_s {order_option}",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s {order_option}",
},
)
self.validate_all(
f"SELECT SUM(x1) AS x_s, x1 AS g_x1 FROM (SELECT * FROM x) GROUP BY g_x1 ORDER BY x_s {order_option}",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s {order_option} GROUP BY x1 AS g_x1",
},
)
with self.subTest(
f"Testing pipe syntax AGGREGATE with GROUP AND ORDER BY for order option: {order_option}"
):
self.validate_all(
f"SELECT g_x1, x_s FROM (SELECT SUM(x1) AS x_s, x1 AS g_x1 FROM (SELECT * FROM x) GROUP BY g_x1 ORDER BY g_x1 {order_option})",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s GROUP AND ORDER BY x1 AS g_x1 {order_option} |> SELECT g_x1, x_s",
},
)
for op_operator in (
"UNION ALL",
"UNION DISTINCT",
"INTERSECT DISTINCT",
"EXCEPT DISTINCT",
):
with self.subTest(f"Testing pipe syntax SET OPERATORS: {op_operator}"):
self.validate_all(
f"FROM x|> {op_operator} (SELECT y1 FROM y), (SELECT z1 FROM z)",
write={
"bigquery": f"SELECT * FROM x {op_operator} (SELECT y1 FROM y) {op_operator} (SELECT z1 FROM z)",
},
)
for op_prefix in ("LEFT OUTER", "FULL OUTER"):
for op_operator in (
"UNION ALL",
"UNION DISTINCT",
"INTERSECT DISTINCT",
"EXCEPT DISTINCT",
):
for suffix_operator in ("BY NAME", "CORRESPONDING"):
with self.subTest(
f"Testing pipe syntax SET OPERATORS: {op_prefix} {op_operator} {suffix_operator}"
):
self.validate_all(
f"FROM x|> SELECT x1, x2 FROM x |> {op_prefix} {op_operator} {suffix_operator} (SELECT y1, y2 FROM y), (SELECT z1, z2 FROM z)",
write={
"bigquery": f"SELECT x1, x2 FROM (SELECT * FROM x) {op_prefix} {op_operator} BY NAME (SELECT y1, y2 FROM y) {op_prefix} {op_operator} BY NAME (SELECT z1, z2 FROM z)",
},
)

View file

@ -732,12 +732,20 @@ class TestHive(Validator):
},
)
self.validate_all(
"x div y",
"x DIV y",
read={
"databricks": "x DIV y",
"duckdb": "x // y",
"hive": "x DIV y",
"spark2": "x DIV y",
"spark": "x DIV y",
},
write={
"duckdb": "x // y",
"databricks": "x DIV y",
"presto": "CAST(CAST(x AS DOUBLE) / y AS INTEGER)",
"hive": "CAST(x / y AS INT)",
"spark": "CAST(x / y AS INT)",
"spark2": "x DIV y",
"spark": "x DIV y",
},
)
self.validate_all(

View file

@ -89,6 +89,20 @@ class TestMySQL(Validator):
self.validate_identity(
"CREATE TABLE test_table (id INT AUTO_INCREMENT, PRIMARY KEY (id) USING HASH)"
)
self.validate_identity(
"CREATE TABLE test (a INT, b INT GENERATED ALWAYS AS (a + a) STORED)"
)
self.validate_identity(
"CREATE TABLE test (a INT, b INT GENERATED ALWAYS AS (a + a) VIRTUAL)"
)
self.validate_identity(
"CREATE TABLE test (a INT, b INT AS (a + a) STORED)",
"CREATE TABLE test (a INT, b INT GENERATED ALWAYS AS (a + a) STORED)",
)
self.validate_identity(
"CREATE TABLE test (a INT, b INT AS (a + a) VIRTUAL)",
"CREATE TABLE test (a INT, b INT GENERATED ALWAYS AS (a + a) VIRTUAL)",
)
self.validate_identity(
"/*left*/ EXPLAIN SELECT /*hint*/ col FROM t1 /*right*/",
"/* left */ DESCRIBE /* hint */ SELECT col FROM t1 /* right */",

View file

@ -0,0 +1,380 @@
from tests.dialects.test_dialect import Validator
class TestPipeSyntax(Validator):
def test_select(self):
self.validate_identity("FROM x", "SELECT * FROM x")
self.validate_identity(
"FROM x |> SELECT x1, x2", "WITH __tmp1 AS (SELECT x1, x2 FROM x) SELECT * FROM __tmp1"
)
self.validate_identity(
"FROM x |> SELECT x.x1, x.x2",
"WITH __tmp1 AS (SELECT x.x1, x.x2 FROM x) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> SELECT x1 as c1, x2 as c2",
"WITH __tmp1 AS (SELECT x1 AS c1, x2 AS c2 FROM x) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> SELECT x1 + 1 as x1_a, x2 - 1 as x2_a |> WHERE x1_a > 1",
"WITH __tmp1 AS (SELECT x1 + 1 AS x1_a, x2 - 1 AS x2_a FROM x) SELECT * FROM __tmp1 WHERE x1_a > 1",
)
self.validate_identity(
"FROM x |> SELECT x1 + 1 as x1_a, x2 - 1 as x2_a |> WHERE x1_a > 1 |> SELECT x2_a",
"WITH __tmp1 AS (SELECT x1 + 1 AS x1_a, x2 - 1 AS x2_a FROM x), __tmp2 AS (SELECT * FROM __tmp1 WHERE x1_a > 1) SELECT x2_a FROM __tmp2",
)
self.validate_identity(
"FROM x |> WHERE x1 > 0 OR x2 > 0 |> WHERE x3 > 1 AND x4 > 1 |> SELECT x1, x4",
"WITH __tmp1 AS (SELECT x1, x4 FROM x WHERE (x1 > 0 OR x2 > 0) AND (x3 > 1 AND x4 > 1)) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> WHERE x1 > 1 |> WHERE x2 > 2 |> SELECT x1 as gt1, x2 as gt2",
"WITH __tmp1 AS (SELECT x1 AS gt1, x2 AS gt2 FROM x WHERE x1 > 1 AND x2 > 2) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> WHERE x1 > 1 AND x2 > 2 |> SELECT x1 as gt1, x2 as gt2 |> SELECT gt1 * 2 + gt2 * 2 AS gt2_2",
"WITH __tmp1 AS (SELECT x1 AS gt1, x2 AS gt2 FROM x WHERE x1 > 1 AND x2 > 2), __tmp2 AS (SELECT * FROM __tmp1) SELECT gt1 * 2 + gt2 * 2 AS gt2_2 FROM __tmp2",
)
def test_order_by(self):
self.validate_identity("FROM x |> ORDER BY x1", "SELECT * FROM x ORDER BY x1")
self.validate_identity(
"FROM x |> ORDER BY x1 |> ORDER BY x2", "SELECT * FROM x ORDER BY x2"
)
self.validate_identity(
"FROM x |> ORDER BY x1 |> WHERE x1 > 0 OR x1 != 1 |> ORDER BY x2 |> WHERE x2 > 0 AND x2 != 1 |> SELECT x1, x2",
"WITH __tmp1 AS (SELECT x1, x2 FROM x WHERE (x1 > 0 OR x1 <> 1) AND (x2 > 0 AND x2 <> 1) ORDER BY x2) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> ORDER BY x1 |> WHERE x1 > 0 |> SELECT x1",
"WITH __tmp1 AS (SELECT x1 FROM x WHERE x1 > 0 ORDER BY x1) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> WHERE x1 > 0 |> SELECT x1 |> ORDER BY x1",
"WITH __tmp1 AS (SELECT x1 FROM x WHERE x1 > 0) SELECT * FROM __tmp1 ORDER BY x1",
)
self.validate_identity(
"FROM x |> SELECT x1, x2, x3 |> ORDER BY x1 DESC NULLS FIRST, x2 ASC NULLS LAST, x3",
"WITH __tmp1 AS (SELECT x1, x2, x3 FROM x) SELECT * FROM __tmp1 ORDER BY x1 DESC NULLS FIRST, x2 ASC NULLS LAST, x3",
)
def test_limit(self):
for option in ("LIMIT 1", "LIMIT 1 OFFSET 2"):
with self.subTest(f"Testing pipe syntax LIMIT and OFFSET option: {option}"):
self.validate_identity(f"FROM x |> {option}", f"SELECT * FROM x {option}")
self.validate_identity(f"FROM x |> {option}", f"SELECT * FROM x {option}")
self.validate_identity(
f"FROM x |> {option} |> SELECT x1, x2 |> WHERE x1 > 0 |> WHERE x2 > 0 |> ORDER BY x1, x2",
f"WITH __tmp1 AS (SELECT x1, x2 FROM x {option}) SELECT * FROM __tmp1 WHERE x1 > 0 AND x2 > 0 ORDER BY x1, x2",
)
self.validate_identity(
f"FROM x |> SELECT x1, x2 |> WHERE x1 > 0 |> WHERE x2 > 0 |> ORDER BY x1, x2 |> {option}",
f"WITH __tmp1 AS (SELECT x1, x2 FROM x) SELECT * FROM __tmp1 WHERE x1 > 0 AND x2 > 0 ORDER BY x1, x2 {option}",
)
self.validate_identity(
"FROM x |> SELECT x1, x2 |> LIMIT 2 |> LIMIT 4",
"WITH __tmp1 AS (SELECT x1, x2 FROM x) SELECT * FROM __tmp1 LIMIT 2",
)
self.validate_identity(
"FROM x |> SELECT x1, x2 |> LIMIT 2 OFFSET 2 |> LIMIT 4 OFFSET 2",
"WITH __tmp1 AS (SELECT x1, x2 FROM x) SELECT * FROM __tmp1 LIMIT 2 OFFSET 4",
)
def test_aggregate(self):
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3)",
"WITH __tmp1 AS (SELECT SUM(x1), MAX(x2), MIN(x3) FROM x) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) AS s_x1 |> SELECT s_x1",
"WITH __tmp1 AS (SELECT SUM(x1) AS s_x1 FROM x), __tmp2 AS (SELECT * FROM __tmp1) SELECT s_x1 FROM __tmp2",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3) GROUP BY x4, x5",
"WITH __tmp1 AS (SELECT SUM(x1), MAX(x2), MIN(x3), x4, x5 FROM x GROUP BY x4, x5) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1), MAX(x2), MIN(x3) GROUP BY x4 AS a_x4, x5 AS a_x5",
"WITH __tmp1 AS (SELECT SUM(x1), MAX(x2), MIN(x3), x4 AS a_x4, x5 AS a_x5 FROM x GROUP BY a_x4, a_x5) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) as s_x1 GROUP BY x1 |> SELECT s_x1, x1 as ss_x1",
"WITH __tmp1 AS (SELECT SUM(x1) AS s_x1, x1 FROM x GROUP BY x1), __tmp2 AS (SELECT * FROM __tmp1) SELECT s_x1, x1 AS ss_x1 FROM __tmp2",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) GROUP",
"WITH __tmp1 AS (SELECT SUM(x1) AS GROUP FROM x) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> AGGREGATE SUM(x1) as s_x1 GROUP BY x2 as g_x2 |> WHERE s_x1 > 0",
"WITH __tmp1 AS (SELECT SUM(x1) AS s_x1, x2 AS g_x2 FROM x GROUP BY g_x2) SELECT * FROM __tmp1 WHERE s_x1 > 0",
)
for order_option in ("ASC", "DESC", "ASC NULLS LAST", "DESC NULLS FIRST"):
with self.subTest(f"Testing pipe syntax AGGREGATE for order option: {order_option}"):
self.validate_all(
f"WITH __tmp1 AS (SELECT SUM(x1) AS x_s FROM x ORDER BY x_s {order_option}) SELECT * FROM __tmp1",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s {order_option}",
},
)
self.validate_all(
f"WITH __tmp1 AS (SELECT SUM(x1) AS x_s, x1 AS g_x1 FROM x GROUP BY g_x1 ORDER BY x_s {order_option}) SELECT * FROM __tmp1",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s {order_option} GROUP BY x1 AS g_x1",
},
)
with self.subTest(
f"Testing pipe syntax AGGREGATE with GROUP AND ORDER BY for order option: {order_option}"
):
self.validate_all(
f"WITH __tmp1 AS (SELECT SUM(x1) AS x_s, x1 AS g_x1 FROM x GROUP BY g_x1 ORDER BY g_x1 {order_option}), __tmp2 AS (SELECT * FROM __tmp1) SELECT g_x1, x_s FROM __tmp2",
read={
"bigquery": f"FROM x |> AGGREGATE SUM(x1) AS x_s GROUP AND ORDER BY x1 AS g_x1 {order_option} |> SELECT g_x1, x_s",
},
)
def test_set_operators(self):
self.validate_identity(
"FROM x |> SELECT x.x1 |> UNION ALL (SELECT 1 AS c)",
"WITH __tmp1 AS (SELECT x.x1 FROM x), __tmp2 AS (SELECT * FROM __tmp1), __tmp3 AS (SELECT * FROM __tmp2 UNION ALL (SELECT 1 AS c)) SELECT * FROM __tmp3",
)
for op_operator in (
"UNION ALL",
"UNION DISTINCT",
"INTERSECT DISTINCT",
"EXCEPT DISTINCT",
):
with self.subTest(f"Testing pipe syntax SET OPERATORS: {op_operator}"):
self.validate_all(
f"FROM x|> {op_operator} (SELECT y1 FROM y), (SELECT z1 FROM z)",
write={
"bigquery": f"WITH __tmp1 AS (SELECT * FROM x), __tmp2 AS (SELECT * FROM __tmp1 {op_operator} (SELECT y1 FROM y) {op_operator} (SELECT z1 FROM z)) SELECT * FROM __tmp2"
},
)
for op_prefix in ("LEFT OUTER", "FULL OUTER"):
for op_operator in (
"UNION ALL",
"UNION DISTINCT",
"INTERSECT DISTINCT",
"EXCEPT DISTINCT",
):
with self.subTest(f"Testing pipe syntax SET OPERATORS: {op_prefix} {op_operator}"):
self.validate_all(
f"FROM x|> SELECT x1, x2 |> {op_prefix} {op_operator} BY NAME (SELECT y1, y2 FROM y), (SELECT z1, z2 FROM z)",
write={
"bigquery": f"WITH __tmp1 AS (SELECT x1, x2 FROM x), __tmp2 AS (SELECT * FROM __tmp1), __tmp3 AS (SELECT * FROM __tmp2 {op_prefix} {op_operator} BY NAME (SELECT y1, y2 FROM y) {op_prefix} {op_operator} BY NAME (SELECT z1, z2 FROM z)) SELECT * FROM __tmp3",
},
)
self.validate_identity(
"FROM d.x |> SELECT x.x1 |> UNION (SELECT 2 AS a1) |> SELECT x1 |> UNION (SELECT 3 as a2) |> SELECT x1 |> WHERE x1 > 100",
"""WITH __tmp1 AS (
SELECT
x.x1
FROM d.x
), __tmp2 AS (
SELECT
*
FROM __tmp1
), __tmp3 AS (
SELECT
*
FROM __tmp2
UNION
(
SELECT
2 AS a1
)
), __tmp4 AS (
SELECT
*
FROM __tmp3
), __tmp5 AS (
SELECT
x1
FROM __tmp4
), __tmp6 AS (
SELECT
*
FROM __tmp5
UNION
(
SELECT
3 AS a2
)
), __tmp7 AS (
SELECT
*
FROM __tmp6
)
SELECT
x1
FROM __tmp7
WHERE
x1 > 100""",
pretty=True,
)
self.validate_identity(
"FROM c.x |> UNION ALL (SELECT 2 AS a1, '2' as a2) |> AGGREGATE AVG(x1) as m_x1 |> SELECT * |> UNION ALL (SELECT y1 FROM c.y) |> SELECT m_x1",
"""WITH __tmp1 AS (
SELECT
*
FROM c.x
), __tmp2 AS (
SELECT
*
FROM __tmp1
UNION ALL
(
SELECT
2 AS a1,
'2' AS a2
)
), __tmp3 AS (
SELECT
*,
AVG(x1) AS m_x1
FROM __tmp2
), __tmp4 AS (
SELECT
*
FROM __tmp3
), __tmp5 AS (
SELECT
*
FROM __tmp4
), __tmp6 AS (
SELECT
*
FROM __tmp5
UNION ALL
(
SELECT
y1
FROM c.y
)
), __tmp7 AS (
SELECT
*
FROM __tmp6
)
SELECT
m_x1
FROM __tmp7""",
pretty=True,
)
self.validate_identity(
"FROM c.x |> UNION ALL (SELECT 2 AS a1, '2' as a2) |> UNION ALL (SELECT y1 FROM c.y) |> WHERE x > 200",
"""WITH __tmp1 AS (
SELECT
*
FROM c.x
), __tmp2 AS (
SELECT
*
FROM __tmp1
UNION ALL
(
SELECT
2 AS a1,
'2' AS a2
)
), __tmp3 AS (
SELECT
*
FROM __tmp2
), __tmp4 AS (
SELECT
*
FROM __tmp3
UNION ALL
(
SELECT
y1
FROM c.y
)
)
SELECT
*
FROM __tmp4
WHERE
x > 200""",
pretty=True,
)
def test_join(self):
self.validate_identity("FROM x |> CROSS JOIN y", "SELECT * FROM x CROSS JOIN y")
for join_type in (
"JOIN",
"INNER JOIN",
"FULL JOIN",
"FULL OUTER JOIN",
"LEFT JOIN",
"LEFT OUTER JOIN",
"RIGHT JOIN",
"RIGHT OUTER JOIN",
):
with self.subTest(f"Testing pipe syntax no projecton with JOIN : {join_type}"):
self.validate_identity(
f"FROM x |> {join_type} y ON x.id = y.id",
f"SELECT * FROM x {join_type} y ON x.id = y.id",
)
with self.subTest(f"Testing pipe syntax projection with JOIN: {join_type}"):
self.validate_identity(
f"FROM x |> SELECT id |> {join_type} y ON x.id = y.id",
f"WITH __tmp1 AS (SELECT id FROM x) SELECT * FROM __tmp1 {join_type} y ON x.id = y.id",
)
with self.subTest(f"Testing pipe syntax complex queries with JOIN: {join_type}"):
self.validate_identity(
f"FROM x |> {join_type} y ON x.id = y.id |> SELECT x1 as a_x1, x2 |> UNION ALL (SELECT 1, 2) |> WHERE a_x1 > 0",
f"""WITH __tmp1 AS (
SELECT
x1 AS a_x1,
x2
FROM x
{join_type} y
ON x.id = y.id
), __tmp2 AS (
SELECT
*
FROM __tmp1
), __tmp3 AS (
SELECT
*
FROM __tmp2
UNION ALL
(
SELECT
1,
2
)
)
SELECT
*
FROM __tmp3
WHERE
a_x1 > 0""",
pretty=True,
)
def test_pivot_unpivot(self):
self.validate_identity(
"FROM x |> PIVOT(SUM(x1) FOR quarter IN ('foo1', 'foo2'))",
"WITH __tmp1 AS (SELECT * FROM x PIVOT(SUM(x1) FOR quarter IN ('foo1', 'foo2'))) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> JOIN y on x.id = y.id |> PIVOT(SUM(x1) FOR quarter IN ('foo1', 'foo2'))",
"WITH __tmp1 AS (SELECT * FROM x PIVOT(SUM(x1) FOR quarter IN ('foo1', 'foo2')) JOIN y ON x.id = y.id) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> UNPIVOT(col FOR item IN (foo1, foo2))",
"WITH __tmp1 AS (SELECT * FROM x UNPIVOT(col FOR item IN (foo1, foo2))) SELECT * FROM __tmp1",
)
self.validate_identity(
"FROM x |> JOIN y on x.id = y.id |> UNPIVOT(col FOR item IN (foo1, foo2))",
"WITH __tmp1 AS (SELECT * FROM x UNPIVOT(col FOR item IN (foo1, foo2)) JOIN y ON x.id = y.id) SELECT * FROM __tmp1",
)

View file

@ -1449,3 +1449,14 @@ CROSS JOIN JSON_ARRAY_ELEMENTS(CAST(JSON_EXTRACT_PATH(tbox, 'boxes') AS JSON)) A
"clickhouse": "SELECT JSONExtractString(foo, '12')",
},
)
def test_udt(self):
def _validate_udt(sql: str):
self.validate_identity(sql).to.assert_is(exp.DataType)
_validate_udt("CAST(5 AS MyType)")
_validate_udt('CAST(5 AS "MyType")')
_validate_udt("CAST(5 AS MySchema.MyType)")
_validate_udt('CAST(5 AS "MySchema"."MyType")')
_validate_udt('CAST(5 AS MySchema."MyType")')
_validate_udt('CAST(5 AS "MyCatalog"."MySchema"."MyType")')

View file

@ -22,6 +22,9 @@ class TestSnowflake(Validator):
expr.selects[0].assert_is(exp.AggFunc)
self.assertEqual(expr.sql(dialect="snowflake"), "SELECT APPROX_TOP_K(C4, 3, 5) FROM t")
self.validate_identity("STRTOK_TO_ARRAY('a b c')")
self.validate_identity("STRTOK_TO_ARRAY('a.b.c', '.')")
self.validate_identity("GET(a, b)")
self.validate_identity("INSERT INTO test VALUES (x'48FAF43B0AFCEF9B63EE3A93EE2AC2')")
self.validate_identity("SELECT STAR(tbl, exclude := [foo])")
self.validate_identity("SELECT CAST([1, 2, 3] AS VECTOR(FLOAT, 3))")
@ -107,6 +110,10 @@ class TestSnowflake(Validator):
self.validate_identity(
"""SELECT TO_TIMESTAMP('2025-01-16T14:45:30.123+0500', 'yyyy-mm-DD"T"hh24:mi:ss.ff3TZHTZM')"""
)
self.validate_identity(
"GET(value, 'foo')::VARCHAR",
"CAST(GET(value, 'foo') AS VARCHAR)",
)
self.validate_identity(
"SELECT 1 put",
"SELECT 1 AS put",

View file

@ -247,6 +247,8 @@ TBLPROPERTIES (
"REFRESH TABLE t",
)
self.validate_identity("ALTER TABLE foo ADD PARTITION(event = 'click')")
self.validate_identity("ALTER TABLE foo ADD IF NOT EXISTS PARTITION(event = 'click')")
self.validate_identity("IF(cond, foo AS bar, bla AS baz)")
self.validate_identity("any_value(col, true)", "ANY_VALUE(col) IGNORE NULLS")
self.validate_identity("first(col, true)", "FIRST(col) IGNORE NULLS")

View file

@ -20,14 +20,18 @@ class TestSQLite(Validator):
self.validate_identity("SELECT (JULIANDAY('now') - 2440587.5) * 86400.0")
self.validate_identity("SELECT UNIXEPOCH('now', 'subsec')")
self.validate_identity("SELECT TIMEDIFF('now', '1809-02-12')")
self.validate_identity("SELECT * FROM GENERATE_SERIES(1, 5)")
self.validate_identity("SELECT INSTR(haystack, needle)")
self.validate_identity(
"SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2]', '$[0]', '$[1]')",
)
self.validate_identity(
"""SELECT item AS "item", some AS "some" FROM data WHERE (item = 'value_1' COLLATE NOCASE) AND (some = 't' COLLATE NOCASE) ORDER BY item ASC LIMIT 1 OFFSET 0"""
)
self.validate_identity("SELECT * FROM GENERATE_SERIES(1, 5)")
self.validate_identity("SELECT INSTR(haystack, needle)")
self.validate_identity(
"ALTER TABLE t RENAME a TO b",
"ALTER TABLE t RENAME COLUMN a TO b",
)
self.validate_all("SELECT LIKE(y, x)", write={"sqlite": "SELECT x LIKE y"})
self.validate_all("SELECT GLOB('*y*', 'xyz')", write={"sqlite": "SELECT 'xyz' GLOB '*y*'"})

View file

@ -39,7 +39,7 @@ class TestTSQL(Validator):
self.validate_identity("CAST(x AS int) OR y", "CAST(x AS INTEGER) <> 0 OR y <> 0")
self.validate_identity("TRUNCATE TABLE t1 WITH (PARTITIONS(1, 2 TO 5, 10 TO 20, 84))")
self.validate_identity(
"SELECT TOP 10 s.RECORDID, n.c.value('(/*:FORM_ROOT/*:SOME_TAG)[1]', 'float') AS SOME_TAG_VALUE FROM source_table.dbo.source_data AS s(nolock) CROSS APPLY FormContent.nodes('/*:FORM_ROOT') AS N(C)"
"SELECT TOP 10 s.RECORDID, n.c.VALUE('(/*:FORM_ROOT/*:SOME_TAG)[1]', 'float') AS SOME_TAG_VALUE FROM source_table.dbo.source_data AS s(nolock) CROSS APPLY FormContent.nodes('/*:FORM_ROOT') AS N(C)"
)
self.validate_identity(
"CREATE CLUSTERED INDEX [IX_OfficeTagDetail_TagDetailID] ON [dbo].[OfficeTagDetail]([TagDetailID] ASC)"

View file

@ -890,4 +890,6 @@ CAST(x AS UINT128)
CAST(x AS UINT256)
SELECT export
SELECT ARG_MAX(DISTINCT selected_col, filtered_col) FROM table
SELECT ARG_MIN(DISTINCT selected_col, filtered_col) FROM table
SELECT ARG_MIN(DISTINCT selected_col, filtered_col) FROM table
a.b.c.D()
a.b.c.d.e.f.G()

View file

@ -1003,3 +1003,9 @@ class TestParser(unittest.TestCase):
table_meta = ast.args["from"].this.this.meta
self.assertEqual(sql[table_meta["start"] : table_meta["end"] + 1], '"test_table_a"')
def test_qualified_function(self):
sql = "a.b.c.d.e.f.g.foo()"
ast = parse_one(sql)
assert not any(isinstance(n, exp.Column) for n in ast.walk())
assert len(list(ast.find_all(exp.Dot))) == 7

View file

@ -17,7 +17,8 @@ class TestTransforms(unittest.TestCase):
def validate(self, transform, sql, target, dialect=None):
with self.subTest(f"{dialect} - {sql}"):
self.assertEqual(
parse_one(sql, dialect=dialect).transform(transform).sql(dialect=dialect), target
parse_one(sql, dialect=dialect).transform(transform).sql(dialect=dialect),
target,
)
def test_unalias_group(self):
@ -274,6 +275,42 @@ class TestTransforms(unittest.TestCase):
== "SELECT a.id FROM a LEFT JOIN b ON a.id = b.id AND b.d = const"
)
# validate parens
self.validate(
eliminate_join_marks,
"select t1.a, t2.b from t1, t2 where (1 = 1) and (t1.id = t2.id1 (+))",
"SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON t1.id = t2.id1 WHERE (1 = 1)",
dialect,
)
# validate a CASE
self.validate(
eliminate_join_marks,
"select t1.a, t2.b from t1, t2 where t1.id = case when t2.id (+) = 'n/a' then null else t2.id (+) end",
"SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON t1.id = CASE WHEN t2.id = 'n/a' THEN NULL ELSE t2.id END",
dialect,
)
# validate OR
self.validate(
eliminate_join_marks,
"select t1.a, t2.b from t1, t2 where t1.id = t2.id1 (+) or t1.id = t2.id2 (+)",
"SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON t1.id = t2.id1 OR t1.id = t2.id2",
dialect,
)
# validate knockout
script = """
SELECT c.customer_name,
(SELECT MAX(o.order_date)
FROM orders o
WHERE o.customer_id(+) = c.customer_id) AS latest_order_date
FROM customers c
"""
self.assertRaises(
AssertionError, eliminate_join_marks, parse_one(script, dialect=dialect)
)
def test_eliminate_window_clause(self):
self.validate(
eliminate_window_clause,