1
0
Fork 0
sqlglot/docs/sqlglot/transforms.html
Daniel Baumann 711d0dde3a
Merging upstream version 26.12.1.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-04-06 10:17:01 +02:00

2786 lines
No EOL
570 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="pdoc 15.0.1"/>
<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>
<style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
<style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
<style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;opacity:0;}nav.pdoc{--pad:clamp(0.5rem, 2vw, 1.75rem);--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent; z-index:1}nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc > div > ul{margin-left:calc(0px - var(--pad));}nav.pdoc li a{padding:.2rem 0 .2rem calc(var(--pad) + var(--indent));}nav.pdoc > div > ul > li > a{padding-left:var(--pad);}nav.pdoc li{transition:all 100ms;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
<style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{cursor:pointer;display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:.75rem center;margin-bottom:1rem;}.pdoc .alert > em{display:none;}.pdoc .alert > *:last-child{margin-bottom:0;}.pdoc .alert.note {color:#084298;background-color:#cfe2ff;border-color:#b6d4fe;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23084298%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8%2016A8%208%200%201%200%208%200a8%208%200%200%200%200%2016zm.93-9.412-1%204.705c-.07.34.029.533.304.533.194%200%20.487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703%200-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381%202.29-.287zM8%205.5a1%201%200%201%201%200-2%201%201%200%200%201%200%202z%22/%3E%3C/svg%3E");}.pdoc .alert.warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23664d03%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8.982%201.566a1.13%201.13%200%200%200-1.96%200L.165%2013.233c-.457.778.091%201.767.98%201.767h13.713c.889%200%201.438-.99.98-1.767L8.982%201.566zM8%205c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%205.995A.905.905%200%200%201%208%205zm.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2z%22/%3E%3C/svg%3E");}.pdoc .alert.danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M5.52.359A.5.5%200%200%201%206%200h4a.5.5%200%200%201%20.474.658L8.694%206H12.5a.5.5%200%200%201%20.395.807l-7%209a.5.5%200%200%201-.873-.454L6.823%209.5H3.5a.5.5%200%200%201-.48-.641l2.5-8.5z%22/%3E%3C/svg%3E");}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc > section:not(.module-info) h1{font-size:1.5rem;font-weight:500;}.pdoc > section:not(.module-info) h2{font-size:1.4rem;font-weight:500;}.pdoc > section:not(.module-info) h3{font-size:1.3rem;font-weight:500;}.pdoc > section:not(.module-info) h4{font-size:1.2rem;}.pdoc > section:not(.module-info) h5{font-size:1.1rem;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--accent);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc > section:not(.module-info){margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.view-source-toggle-state,.view-source-toggle-state ~ .pdoc-code{display:none;}.view-source-toggle-state:checked ~ .pdoc-code{display:block;}.view-source-button{display:inline-block;float:right;font-size:.75rem;line-height:1.5rem;color:var(--muted);padding:0 .4rem 0 1.3rem;cursor:pointer;text-indent:-2px;}.view-source-button > span{visibility:hidden;}.module-info .view-source-button{float:none;display:flex;justify-content:flex-end;margin:-1.2rem .4rem -.2rem 0;}.view-source-button::before{position:absolute;content:"View Source";display:list-item;list-style-type:disclosure-closed;}.view-source-toggle-state:checked ~ .attr .view-source-button::before,.view-source-toggle-state:checked ~ .view-source-button::before{list-style-type:disclosure-open;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc section:not(.module-info) .docstring{margin-left:clamp(0rem, 5vw - 2rem, 1rem);}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target,.pdoc .pdoc-code > pre > span:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc .pdoc-code > pre > span:target{display:block;}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc *{scroll-margin:2rem;}.pdoc .pdoc-code .linenos{user-select:none;}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc section, .pdoc .classattr{position:relative;}.pdoc .headerlink{--width:clamp(1rem, 3vw, 2rem);position:absolute;top:0;left:calc(0rem - var(--width));transition:all 100ms ease-in-out;opacity:0;}.pdoc .headerlink::before{content:"#";display:block;text-align:center;width:var(--width);height:2.3rem;line-height:2.3rem;font-size:1.5rem;}.pdoc .attr:hover ~ .headerlink,.pdoc *:target > .headerlink,.pdoc .headerlink:hover{opacity:1;}.pdoc .attr{display:block;margin:.5rem 0 .5rem;padding:.4rem .4rem .4rem 1rem;background-color:var(--accent);overflow-x:auto;}.pdoc .classattr{margin-left:2rem;}.pdoc .decorator-deprecated{color:#842029;}.pdoc .decorator-deprecated ~ span{filter:grayscale(1) opacity(0.8);}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{background-color:transparent;}.pdoc .param, .pdoc .return-annotation{white-space:pre;}.pdoc .signature.multiline .param{display:block;}.pdoc .signature.condensed .param{display:inline-block;}.pdoc .annotation{color:var(--annotation);}.pdoc .view-value-toggle-state,.pdoc .view-value-toggle-state ~ .default_value{display:none;}.pdoc .view-value-toggle-state:checked ~ .default_value{display:inherit;}.pdoc .view-value-button{font-size:.5rem;vertical-align:middle;border-style:dashed;margin-top:-0.1rem;}.pdoc .view-value-button:hover{background:white;}.pdoc .view-value-button::before{content:"show";text-align:center;width:2.2em;display:inline-block;}.pdoc .view-value-toggle-state:checked ~ .view-value-button::before{content:"hide";}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
<style>/*! custom.css */</style></head>
<body>
<nav class="pdoc">
<label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
<input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
<div> <a class="pdoc-button module-list-button" href="../sqlglot.html">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
<path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
</svg> &nbsp;sqlglot</a>
<input type="search" placeholder="Search..." role="searchbox" aria-label="search"
pattern=".+" required>
<h2>API Documentation</h2>
<ul class="memberlist">
<li>
<a class="function" href="#preprocess">preprocess</a>
</li>
<li>
<a class="function" href="#unnest_generate_date_array_using_recursive_cte">unnest_generate_date_array_using_recursive_cte</a>
</li>
<li>
<a class="function" href="#unnest_generate_series">unnest_generate_series</a>
</li>
<li>
<a class="function" href="#unalias_group">unalias_group</a>
</li>
<li>
<a class="function" href="#eliminate_distinct_on">eliminate_distinct_on</a>
</li>
<li>
<a class="function" href="#eliminate_qualify">eliminate_qualify</a>
</li>
<li>
<a class="function" href="#remove_precision_parameterized_types">remove_precision_parameterized_types</a>
</li>
<li>
<a class="function" href="#unqualify_unnest">unqualify_unnest</a>
</li>
<li>
<a class="function" href="#unnest_to_explode">unnest_to_explode</a>
</li>
<li>
<a class="function" href="#explode_projection_to_unnest">explode_projection_to_unnest</a>
</li>
<li>
<a class="function" href="#add_within_group_for_percentiles">add_within_group_for_percentiles</a>
</li>
<li>
<a class="function" href="#remove_within_group_for_percentiles">remove_within_group_for_percentiles</a>
</li>
<li>
<a class="function" href="#add_recursive_cte_column_names">add_recursive_cte_column_names</a>
</li>
<li>
<a class="function" href="#epoch_cast_to_ts">epoch_cast_to_ts</a>
</li>
<li>
<a class="function" href="#eliminate_semi_and_anti_joins">eliminate_semi_and_anti_joins</a>
</li>
<li>
<a class="function" href="#eliminate_full_outer_join">eliminate_full_outer_join</a>
</li>
<li>
<a class="function" href="#move_ctes_to_top_level">move_ctes_to_top_level</a>
</li>
<li>
<a class="function" href="#ensure_bools">ensure_bools</a>
</li>
<li>
<a class="function" href="#unqualify_columns">unqualify_columns</a>
</li>
<li>
<a class="function" href="#remove_unique_constraints">remove_unique_constraints</a>
</li>
<li>
<a class="function" href="#ctas_with_tmp_tables_to_create_tmp_view">ctas_with_tmp_tables_to_create_tmp_view</a>
</li>
<li>
<a class="function" href="#move_schema_columns_to_partitioned_by">move_schema_columns_to_partitioned_by</a>
</li>
<li>
<a class="function" href="#move_partitioned_by_to_schema_columns">move_partitioned_by_to_schema_columns</a>
</li>
<li>
<a class="function" href="#struct_kv_to_alias">struct_kv_to_alias</a>
</li>
<li>
<a class="function" href="#eliminate_join_marks">eliminate_join_marks</a>
</li>
<li>
<a class="function" href="#any_to_exists">any_to_exists</a>
</li>
</ul>
<footer>Copyright (c) 2023 Toby Mao</footer>
<a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev" target="_blank">
built with <span class="visually-hidden">pdoc</span><img
alt="pdoc logo"
src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
</a>
</div>
</nav>
<main class="pdoc">
<section class="module-info">
<a class="pdoc-button git-button" href="https://github.com/tobymao/sqlglot/tree/main/sqlglot/transforms.py">Edit on GitHub</a>
<h1 class="modulename">
<a href="./../sqlglot.html">sqlglot</a><wbr>.transforms </h1>
<input id="mod-transforms-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-source-button" for="mod-transforms-view-source"><span>View Source</span></label>
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">__future__</span><span class="w"> </span><span class="kn">import</span> <span class="n">annotations</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">import</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">t</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot</span><span class="w"> </span><span class="kn">import</span> <span class="n">expressions</span> <span class="k">as</span> <span class="n">exp</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.errors</span><span class="w"> </span><span class="kn">import</span> <span class="n">UnsupportedError</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.helper</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_new_name</span><span class="p">,</span> <span class="n">name_sequence</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot._typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">E</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.generator</span><span class="w"> </span><span class="kn">import</span> <span class="n">Generator</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="k">def</span><span class="w"> </span><span class="nf">preprocess</span><span class="p">(</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> Args:</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> Returns:</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="k">for</span> <span class="n">transform</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="k">except</span> <span class="n">UnsupportedError</span> <span class="k">as</span> <span class="n">unsupported_error</span><span class="p">:</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">unsupported_error</span><span class="p">))</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</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">Func</span><span class="p">):</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_generate_date_array_using_recursive_cte</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-65"><a href="#L-65"><span class="linenos"> 65</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-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">recursive_ctes</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">for</span> <span class="n">unnest</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">Unnest</span><span class="p">):</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">GenerateDateArray</span><span class="p">)</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="p">):</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">continue</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="n">generate_date_array</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">start</span> <span class="o">=</span> <span class="n">generate_date_array</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;start&quot;</span><span class="p">)</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">end</span> <span class="o">=</span> <span class="n">generate_date_array</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;end&quot;</span><span class="p">)</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">step</span> <span class="o">=</span> <span class="n">generate_date_array</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;step&quot;</span><span class="p">)</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">start</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">end</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Interval</span><span class="p">):</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">continue</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">column_name</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;date_value&quot;</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">start</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">)</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">date_add</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="s2">&quot;date_add&quot;</span><span class="p">,</span> <span class="n">column_name</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">step</span><span class="o">.</span><span class="n">name</span><span class="p">),</span> <span class="n">step</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;unit&quot;</span><span class="p">)</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="p">)</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">cast_date_add</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">date_add</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">cte_name</span> <span class="o">=</span> <span class="s2">&quot;_generated_dates&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;_</span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">count</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">base_query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">start</span><span class="o">.</span><span class="n">as_</span><span class="p">(</span><span class="n">column_name</span><span class="p">))</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">recursive_query</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">cast_date_add</span><span class="p">)</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">cte_name</span><span class="p">)</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">cast_date_add</span> <span class="o">&lt;=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">end</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">))</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="p">)</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">cte_query</span> <span class="o">=</span> <span class="n">base_query</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">recursive_query</span><span class="p">,</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">generate_dates_query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">column_name</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">cte_name</span><span class="p">)</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">generate_dates_query</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">cte_name</span><span class="p">))</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">recursive_ctes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">cte_query</span><span class="p">),</span> <span class="n">cte_name</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">column_name</span><span class="p">])</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="p">)</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="k">if</span> <span class="n">recursive_ctes</span><span class="p">:</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="n">with_expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">()</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">with_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">with_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="o">*</span><span class="n">recursive_ctes</span><span class="p">,</span> <span class="o">*</span><span class="n">with_expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">])</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="n">with_expression</span><span class="p">)</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_generate_series</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-122"><a href="#L-122"><span class="linenos">122</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Unnests GENERATE_SERIES or SEQUENCE table references.&quot;&quot;&quot;</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span> <span class="ow">and</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">GenerateSeries</span><span class="p">):</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">this</span><span class="p">])</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_u&quot;</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">],</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">return</span> <span class="n">unnest</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unalias_group</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-135"><a href="#L-135"><span class="linenos">135</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a><span class="sd"> Example:</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a><span class="sd"> Args:</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> Returns:</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="p">}</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="p">):</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_distinct_on</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-168"><a href="#L-168"><span class="linenos">168</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a><span class="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a><span class="sd"> Args:</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a><span class="sd"> Returns:</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <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;distinct&quot;</span><span class="p">)</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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;on&quot;</span><span class="p">),</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="p">):</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">row_number_window_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</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="o">.</span><span class="n">expressions</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</span><span class="p">)</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="n">order</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">)</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">order</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">distinct_cols</span><span class="p">]))</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number_window_alias</span><span class="p">)</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="c1"># We add aliases to the projections so that we can safely reference them in the outer query</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="n">new_selects</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="n">taken_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">row_number_window_alias</span><span class="p">}</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">is_star</span><span class="p">:</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="n">new_selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Star</span><span class="p">()]</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="k">break</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">):</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_names</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">output_name</span> <span class="ow">or</span> <span class="s2">&quot;_col&quot;</span><span class="p">)</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="n">quoted</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;quoted&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="n">quoted</span><span class="p">))</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">taken_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">new_selects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">])</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">new_selects</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">&quot;_t&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">row_number_window_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="p">)</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_qualify</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-224"><a href="#L-224"><span class="linenos">224</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a><span class="sd"> Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a><span class="sd"> The idea behind this transformation can be seen in Snowflake&#39;s documentation for QUALIFY:</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a><span class="sd"> https://docs.snowflake.com/en/sql-reference/constructs/qualify</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a><span class="sd"> Some dialects don&#39;t support window functions in the WHERE clause, so we need to include them as</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a><span class="sd"> projections in the subquery, in order to refer to them in the outer filter using aliases. Also,</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a><span class="sd"> if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a><span class="sd"> otherwise we won&#39;t be able to refer to it in the outer query&#39;s WHERE clause. Finally, if a</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a><span class="sd"> newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a><span class="sd"> corresponding expression to avoid creating invalid column references.</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</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;qualify&quot;</span><span class="p">):</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">,</span> <span class="s2">&quot;_c&quot;</span><span class="p">)</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="n">select</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">alias</span><span class="p">))</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="n">taken</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_select_alias_or_name</span><span class="p">(</span><span class="n">select</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">:</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">alias_or_name</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">identifier</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">identifier</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">):</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="n">identifier</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;quoted&quot;</span><span class="p">))</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="k">return</span> <span class="n">alias_or_name</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_select_alias_or_name</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">)))</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="n">qualify_filters</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;qualify&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="n">expression_by_alias</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="p">}</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="n">select_candidates</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">is_star</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Window</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-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="k">for</span> <span class="n">select_candidate</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">qualify_filters</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">select_candidates</span><span class="p">)):</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select_candidate</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-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="k">if</span> <span class="n">expression_by_alias</span><span class="p">:</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">select_candidate</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-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="n">expr</span> <span class="o">=</span> <span class="n">expression_by_alias</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="k">if</span> <span class="n">expr</span><span class="p">:</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="n">column</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_w&quot;</span><span class="p">)</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">select_candidate</span><span class="p">,</span> <span class="n">alias</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select_candidate</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">Qualify</span><span class="p">):</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">qualify_filters</span> <span class="o">=</span> <span class="n">column</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="n">select_candidate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="k">elif</span> <span class="n">select_candidate</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">:</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">select_candidate</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="k">return</span> <span class="n">outer_selects</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_t&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a> <span class="n">qualify_filters</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="p">)</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a>
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a>
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_precision_parameterized_types</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-288"><a href="#L-288"><span class="linenos">288</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in</span>
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a><span class="sd"> other expressions. This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">):</span>
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a> <span class="n">node</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataTypeParam</span><span class="p">)]</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a> <span class="p">)</span>
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a>
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a>
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a>
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unqualify_unnest</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-301"><a href="#L-301"><span class="linenos">301</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove references to unnest table aliases, added by the optimizer&#39;s qualify_columns step.&quot;&quot;&quot;</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</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-303"><a href="#L-303"><span class="linenos">303</span></a>
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a> <span class="k">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-305"><a href="#L-305"><span class="linenos">305</span></a> <span class="n">unnest_aliases</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">alias</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a> <span class="k">for</span> <span class="n">unnest</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">Unnest</span><span class="p">)</span>
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a> <span class="p">}</span>
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a> <span class="k">if</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a> <span class="k">for</span> <span class="n">column</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">Column</span><span class="p">):</span>
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="ow">in</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;table&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a> <span class="k">elif</span> <span class="n">column</span><span class="o">.</span><span class="n">db</span> <span class="ow">in</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;db&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a>
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a>
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a>
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_to_explode</span><span class="p">(</span>
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a> <span class="n">unnest_using_arrays_zip</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-324"><a href="#L-324"><span class="linenos">324</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert cross join unnest into lateral view explode.&quot;&quot;&quot;</span>
</span><span id="L-325"><a href="#L-325"><span class="linenos">325</span></a>
</span><span id="L-326"><a href="#L-326"><span class="linenos">326</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_unnest_zip_exprs</span><span class="p">(</span>
</span><span id="L-327"><a href="#L-327"><span class="linenos">327</span></a> <span class="n">u</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">,</span> <span class="n">unnest_exprs</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">has_multi_expr</span><span class="p">:</span> <span class="nb">bool</span>
</span><span id="L-328"><a href="#L-328"><span class="linenos">328</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-329"><a href="#L-329"><span class="linenos">329</span></a> <span class="k">if</span> <span class="n">has_multi_expr</span><span class="p">:</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos">330</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">unnest_using_arrays_zip</span><span class="p">:</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos">331</span></a> <span class="k">raise</span> <span class="n">UnsupportedError</span><span class="p">(</span><span class="s2">&quot;Cannot transpile UNNEST with multiple input arrays&quot;</span><span class="p">)</span>
</span><span id="L-332"><a href="#L-332"><span class="linenos">332</span></a>
</span><span id="L-333"><a href="#L-333"><span class="linenos">333</span></a> <span class="c1"># Use INLINE(ARRAYS_ZIP(...)) for multiple expressions</span>
</span><span id="L-334"><a href="#L-334"><span class="linenos">334</span></a> <span class="n">zip_exprs</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">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-335"><a href="#L-335"><span class="linenos">335</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Anonymous</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="s2">&quot;ARRAYS_ZIP&quot;</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">unnest_exprs</span><span class="p">)</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos">336</span></a> <span class="p">]</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos">337</span></a> <span class="n">u</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">zip_exprs</span><span class="p">)</span>
</span><span id="L-338"><a href="#L-338"><span class="linenos">338</span></a> <span class="k">return</span> <span class="n">zip_exprs</span>
</span><span id="L-339"><a href="#L-339"><span class="linenos">339</span></a> <span class="k">return</span> <span class="n">unnest_exprs</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos">340</span></a>
</span><span id="L-341"><a href="#L-341"><span class="linenos">341</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_udtf_type</span><span class="p">(</span><span class="n">u</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Func</span><span class="p">]:</span>
</span><span id="L-342"><a href="#L-342"><span class="linenos">342</span></a> <span class="k">if</span> <span class="n">u</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;offset&quot;</span><span class="p">):</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos">343</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span>
</span><span id="L-344"><a href="#L-344"><span class="linenos">344</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Inline</span> <span class="k">if</span> <span class="n">has_multi_expr</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos">345</span></a>
</span><span id="L-346"><a href="#L-346"><span class="linenos">346</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-347"><a href="#L-347"><span class="linenos">347</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">)</span>
</span><span id="L-348"><a href="#L-348"><span class="linenos">348</span></a>
</span><span id="L-349"><a href="#L-349"><span class="linenos">349</span></a> <span class="k">if</span> <span class="n">from_</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos">350</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">from_</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-351"><a href="#L-351"><span class="linenos">351</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="L-352"><a href="#L-352"><span class="linenos">352</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-353"><a href="#L-353"><span class="linenos">353</span></a> <span class="n">has_multi_expr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">exprs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="L-354"><a href="#L-354"><span class="linenos">354</span></a> <span class="n">this</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span> <span class="o">=</span> <span class="n">_unnest_zip_exprs</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exprs</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)</span>
</span><span id="L-355"><a href="#L-355"><span class="linenos">355</span></a>
</span><span id="L-356"><a href="#L-356"><span class="linenos">356</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
</span><span id="L-357"><a href="#L-357"><span class="linenos">357</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">(</span>
</span><span id="L-358"><a href="#L-358"><span class="linenos">358</span></a> <span class="n">this</span><span class="o">=</span><span class="n">_udtf_type</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)(</span>
</span><span id="L-359"><a href="#L-359"><span class="linenos">359</span></a> <span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="p">,</span>
</span><span id="L-360"><a href="#L-360"><span class="linenos">360</span></a> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</span><span class="p">,</span>
</span><span id="L-361"><a href="#L-361"><span class="linenos">361</span></a> <span class="p">),</span>
</span><span id="L-362"><a href="#L-362"><span class="linenos">362</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos">363</span></a> <span class="p">)</span>
</span><span id="L-364"><a href="#L-364"><span class="linenos">364</span></a> <span class="p">)</span>
</span><span id="L-365"><a href="#L-365"><span class="linenos">365</span></a>
</span><span id="L-366"><a href="#L-366"><span class="linenos">366</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
</span><span id="L-367"><a href="#L-367"><span class="linenos">367</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">joins</span><span class="p">):</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos">368</span></a> <span class="n">join_expr</span> <span class="o">=</span> <span class="n">join</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-369"><a href="#L-369"><span class="linenos">369</span></a>
</span><span id="L-370"><a href="#L-370"><span class="linenos">370</span></a> <span class="n">is_lateral</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">join_expr</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">)</span>
</span><span id="L-371"><a href="#L-371"><span class="linenos">371</span></a>
</span><span id="L-372"><a href="#L-372"><span class="linenos">372</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">join_expr</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="n">is_lateral</span> <span class="k">else</span> <span class="n">join_expr</span>
</span><span id="L-373"><a href="#L-373"><span class="linenos">373</span></a>
</span><span id="L-374"><a href="#L-374"><span class="linenos">374</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
</span><span id="L-375"><a href="#L-375"><span class="linenos">375</span></a> <span class="k">if</span> <span class="n">is_lateral</span><span class="p">:</span>
</span><span id="L-376"><a href="#L-376"><span class="linenos">376</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">join_expr</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;alias&quot;</span><span class="p">)</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos">377</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-378"><a href="#L-378"><span class="linenos">378</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="L-379"><a href="#L-379"><span class="linenos">379</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-380"><a href="#L-380"><span class="linenos">380</span></a> <span class="c1"># The number of unnest.expressions will be changed by _unnest_zip_exprs, we need to record it here</span>
</span><span id="L-381"><a href="#L-381"><span class="linenos">381</span></a> <span class="n">has_multi_expr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">exprs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="L-382"><a href="#L-382"><span class="linenos">382</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">_unnest_zip_exprs</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exprs</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)</span>
</span><span id="L-383"><a href="#L-383"><span class="linenos">383</span></a>
</span><span id="L-384"><a href="#L-384"><span class="linenos">384</span></a> <span class="n">joins</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">join</span><span class="p">)</span>
</span><span id="L-385"><a href="#L-385"><span class="linenos">385</span></a>
</span><span id="L-386"><a href="#L-386"><span class="linenos">386</span></a> <span class="n">alias_cols</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">columns</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="L-387"><a href="#L-387"><span class="linenos">387</span></a>
</span><span id="L-388"><a href="#L-388"><span class="linenos">388</span></a> <span class="c1"># # Handle UNNEST to LATERAL VIEW EXPLODE: Exception is raised when there are 0 or &gt; 2 aliases</span>
</span><span id="L-389"><a href="#L-389"><span class="linenos">389</span></a> <span class="c1"># Spark LATERAL VIEW EXPLODE requires single alias for array/struct and two for Map type column unlike unnest in trino/presto which can take an arbitrary amount.</span>
</span><span id="L-390"><a href="#L-390"><span class="linenos">390</span></a> <span class="c1"># Refs: https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-lateral-view.html</span>
</span><span id="L-391"><a href="#L-391"><span class="linenos">391</span></a>
</span><span id="L-392"><a href="#L-392"><span class="linenos">392</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">has_multi_expr</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">alias_cols</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
</span><span id="L-393"><a href="#L-393"><span class="linenos">393</span></a> <span class="k">raise</span> <span class="n">UnsupportedError</span><span class="p">(</span>
</span><span id="L-394"><a href="#L-394"><span class="linenos">394</span></a> <span class="s2">&quot;CROSS JOIN UNNEST to LATERAL VIEW EXPLODE transformation requires explicit column aliases&quot;</span>
</span><span id="L-395"><a href="#L-395"><span class="linenos">395</span></a> <span class="p">)</span>
</span><span id="L-396"><a href="#L-396"><span class="linenos">396</span></a>
</span><span id="L-397"><a href="#L-397"><span class="linenos">397</span></a> <span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">column</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">exprs</span><span class="p">,</span> <span class="n">alias_cols</span><span class="p">):</span>
</span><span id="L-398"><a href="#L-398"><span class="linenos">398</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="L-399"><a href="#L-399"><span class="linenos">399</span></a> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span>
</span><span id="L-400"><a href="#L-400"><span class="linenos">400</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">(</span>
</span><span id="L-401"><a href="#L-401"><span class="linenos">401</span></a> <span class="n">this</span><span class="o">=</span><span class="n">_udtf_type</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)(</span><span class="n">this</span><span class="o">=</span><span class="n">e</span><span class="p">),</span>
</span><span id="L-402"><a href="#L-402"><span class="linenos">402</span></a> <span class="n">view</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-403"><a href="#L-403"><span class="linenos">403</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos">404</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="c1"># type: ignore</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos">405</span></a> <span class="n">columns</span><span class="o">=</span><span class="n">alias_cols</span><span class="p">,</span>
</span><span id="L-406"><a href="#L-406"><span class="linenos">406</span></a> <span class="p">),</span>
</span><span id="L-407"><a href="#L-407"><span class="linenos">407</span></a> <span class="p">),</span>
</span><span id="L-408"><a href="#L-408"><span class="linenos">408</span></a> <span class="p">)</span>
</span><span id="L-409"><a href="#L-409"><span class="linenos">409</span></a>
</span><span id="L-410"><a href="#L-410"><span class="linenos">410</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos">411</span></a>
</span><span id="L-412"><a href="#L-412"><span class="linenos">412</span></a>
</span><span id="L-413"><a href="#L-413"><span class="linenos">413</span></a><span class="k">def</span><span class="w"> </span><span class="nf">explode_projection_to_unnest</span><span class="p">(</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos">414</span></a> <span class="n">index_offset</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="L-415"><a href="#L-415"><span class="linenos">415</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-416"><a href="#L-416"><span class="linenos">416</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert explode/posexplode projections into unnests.&quot;&quot;&quot;</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos">417</span></a>
</span><span id="L-418"><a href="#L-418"><span class="linenos">418</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_explode_projection_to_unnest</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-419"><a href="#L-419"><span class="linenos">419</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-420"><a href="#L-420"><span class="linenos">420</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">Scope</span>
</span><span id="L-421"><a href="#L-421"><span class="linenos">421</span></a>
</span><span id="L-422"><a href="#L-422"><span class="linenos">422</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="L-423"><a href="#L-423"><span class="linenos">423</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="o">.</span><span class="n">references</span><span class="p">}</span>
</span><span id="L-424"><a href="#L-424"><span class="linenos">424</span></a>
</span><span id="L-425"><a href="#L-425"><span class="linenos">425</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">new_name</span><span class="p">(</span><span class="n">names</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-426"><a href="#L-426"><span class="linenos">426</span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span><span id="L-427"><a href="#L-427"><span class="linenos">427</span></a> <span class="n">names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-428"><a href="#L-428"><span class="linenos">428</span></a> <span class="k">return</span> <span class="n">name</span>
</span><span id="L-429"><a href="#L-429"><span class="linenos">429</span></a>
</span><span id="L-430"><a href="#L-430"><span class="linenos">430</span></a> <span class="n">arrays</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Condition</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a> <span class="n">series_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="L-432"><a href="#L-432"><span class="linenos">432</span></a> <span class="n">series</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">GenerateSeries</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">index_offset</span><span class="p">))]</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a> <span class="p">),</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">&quot;_u&quot;</span><span class="p">),</span>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">series_alias</span><span class="p">],</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="p">)</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a> <span class="c1"># we use list here because expression.selects is mutated inside the loop</span>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">):</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a> <span class="n">explode</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">)</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a> <span class="k">if</span> <span class="n">explode</span><span class="p">:</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">):</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Aliases</span><span class="p">):</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a> <span class="n">explode</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">)</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="k">assert</span> <span class="n">explode</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a> <span class="n">is_posexplode</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">explode</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ExplodeOuter</span><span class="p">):</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="n">bracket</span> <span class="o">=</span> <span class="n">explode_arg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="n">bracket</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;safe&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="n">bracket</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;offset&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="s2">&quot;IF&quot;</span><span class="p">,</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="s2">&quot;ARRAY_SIZE&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;COALESCE&quot;</span><span class="p">,</span> <span class="n">explode_arg</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">())</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">bracket</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a> <span class="n">explode_arg</span><span class="p">,</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a> <span class="p">)</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a> <span class="c1"># This ensures that we won&#39;t use [POS]EXPLODE&#39;s argument as a new selection</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">):</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">&quot;_u&quot;</span><span class="p">)</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;col&quot;</span><span class="p">)</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">pos_alias</span><span class="p">:</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a> <span class="n">alias</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="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="n">series_table_alias</span> <span class="o">=</span> <span class="n">series</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">If</span><span class="p">(</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a> <span class="p">),</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="n">true</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">),</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a> <span class="p">)</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a> <span class="n">explode</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">If</span><span class="p">(</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a> <span class="p">),</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a> <span class="n">true</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">),</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a> <span class="p">)</span><span class="o">.</span><span class="n">as_</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">),</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="p">)</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">expressions</span><span class="p">)</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">arrays</span><span class="p">:</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">):</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="n">size</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Condition</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="n">arrays</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a>
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a> <span class="c1"># trino doesn&#39;t support left join unnest with on conditions</span>
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="c1"># if it did, this would be much simpler</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span>
</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span>
</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a> <span class="n">offset</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">),</span>
</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a> <span class="p">),</span>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a> <span class="n">unnest_source_alias</span><span class="p">,</span>
</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">explode_alias</span><span class="p">],</span>
</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="p">),</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">&quot;CROSS&quot;</span><span class="p">,</span>
</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a> <span class="p">)</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a>
</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a> <span class="k">if</span> <span class="n">index_offset</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a> <span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a>
</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span>
</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a> <span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">))</span>
</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="o">.</span><span class="n">or_</span><span class="p">(</span>
</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">size</span><span class="p">)</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span>
</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a> <span class="p">)</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a> <span class="p">),</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a> <span class="p">)</span>
</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a> <span class="k">if</span> <span class="n">arrays</span><span class="p">:</span>
</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a> <span class="n">end</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Condition</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Greatest</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">arrays</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">expressions</span><span class="o">=</span><span class="n">arrays</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a>
</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a> <span class="k">if</span> <span class="n">index_offset</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a> <span class="n">end</span> <span class="o">=</span> <span class="n">end</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">index_offset</span><span class="p">)</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="n">series</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;end&quot;</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a>
</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a>
</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a> <span class="k">return</span> <span class="n">_explode_projection_to_unnest</span>
</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</span></a>
</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a><span class="k">def</span><span class="w"> </span><span class="nf">add_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Transforms percentiles by adding a WITHIN GROUP clause to them.&quot;&quot;&quot;</span>
</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PERCENTILES</span><span class="p">)</span>
</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a> <span class="p">):</span>
</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a> <span class="n">order</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)])</span>
</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">order</span><span class="p">)</span>
</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a>
</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a>
</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a>
</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause.&quot;&quot;&quot;</span>
</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PERCENTILES</span><span class="p">)</span>
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">)</span>
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a> <span class="p">):</span>
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a>
</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a>
</span><span id="L-594"><a href="#L-594"><span class="linenos">594</span></a>
</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a><span class="k">def</span><span class="w"> </span><span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Uses projection output names in recursive CTE definitions to define the CTEs&#39; columns.&quot;&quot;&quot;</span>
</span><span id="L-597"><a href="#L-597"><span class="linenos">597</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">&quot;_c_&quot;</span><span class="p">)</span>
</span><span id="L-599"><a href="#L-599"><span class="linenos">599</span></a>
</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a> <span class="k">for</span> <span class="n">cte</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">SetOperation</span><span class="p">):</span>
</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a>
</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a> <span class="s2">&quot;columns&quot;</span><span class="p">,</span>
</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a> <span class="p">)</span>
</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a>
</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a>
</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a>
</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a><span class="k">def</span><span class="w"> </span><span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Replace &#39;epoch&#39; in casts by the equivalent date literal.&quot;&quot;&quot;</span>
</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-617"><a href="#L-617"><span class="linenos">617</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
</span><span id="L-618"><a href="#L-618"><span class="linenos">618</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;epoch&quot;</span>
</span><span id="L-619"><a href="#L-619"><span class="linenos">619</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
</span><span id="L-620"><a href="#L-620"><span class="linenos">620</span></a> <span class="p">):</span>
</span><span id="L-621"><a href="#L-621"><span class="linenos">621</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;1970-01-01 00:00:00&quot;</span><span class="p">))</span>
</span><span id="L-622"><a href="#L-622"><span class="linenos">622</span></a>
</span><span id="L-623"><a href="#L-623"><span class="linenos">623</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-624"><a href="#L-624"><span class="linenos">624</span></a>
</span><span id="L-625"><a href="#L-625"><span class="linenos">625</span></a>
</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_semi_and_anti_joins</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-627"><a href="#L-627"><span class="linenos">627</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert SEMI and ANTI joins into equivalent forms that use EXIST instead.&quot;&quot;&quot;</span>
</span><span id="L-628"><a href="#L-628"><span class="linenos">628</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-629"><a href="#L-629"><span class="linenos">629</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a> <span class="n">on</span> <span class="o">=</span> <span class="n">join</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;on&quot;</span><span class="p">)</span>
</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a> <span class="k">if</span> <span class="n">on</span> <span class="ow">and</span> <span class="n">join</span><span class="o">.</span><span class="n">kind</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;SEMI&quot;</span><span class="p">,</span> <span class="s2">&quot;ANTI&quot;</span><span class="p">):</span>
</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a> <span class="n">subquery</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">on</span><span class="p">)</span>
</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a> <span class="n">exists</span> <span class="o">=</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">subquery</span><span class="p">)</span>
</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a> <span class="k">if</span> <span class="n">join</span><span class="o">.</span><span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;ANTI&quot;</span><span class="p">:</span>
</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a> <span class="n">exists</span> <span class="o">=</span> <span class="n">exists</span><span class="o">.</span><span class="n">not_</span><span class="p">(</span><span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a>
</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a> <span class="n">join</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-638"><a href="#L-638"><span class="linenos">638</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exists</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a>
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a>
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a>
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_full_outer_join</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-644"><a href="#L-644"><span class="linenos">644</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a><span class="sd"> Converts a query with a FULL OUTER join to a union of identical queries that</span>
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a><span class="sd"> use LEFT/RIGHT OUTER joins instead. This transformation currently only works</span>
</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a><span class="sd"> for queries that have a single FULL OUTER join.</span>
</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-649"><a href="#L-649"><span class="linenos">649</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-650"><a href="#L-650"><span class="linenos">650</span></a> <span class="n">full_outer_joins</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a> <span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">join</span><span class="p">)</span>
</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">join</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="k">if</span> <span class="n">join</span><span class="o">.</span><span class="n">side</span> <span class="o">==</span> <span class="s2">&quot;FULL&quot;</span>
</span><span id="L-654"><a href="#L-654"><span class="linenos">654</span></a> <span class="p">]</span>
</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a>
</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">full_outer_joins</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a> <span class="n">expression_copy</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;limit&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a> <span class="n">index</span><span class="p">,</span> <span class="n">full_outer_join</span> <span class="o">=</span> <span class="n">full_outer_joins</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-660"><a href="#L-660"><span class="linenos">660</span></a>
</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="n">tables</span> <span class="o">=</span> <span class="p">(</span><span class="n">expression</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">alias_or_name</span><span class="p">,</span> <span class="n">full_outer_join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span>
</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a> <span class="n">join_conditions</span> <span class="o">=</span> <span class="n">full_outer_join</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;on&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span>
</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a> <span class="o">*</span><span class="p">[</span>
</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="n">tables</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">full_outer_join</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;using&quot;</span><span class="p">)</span>
</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="p">]</span>
</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="p">)</span>
</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a>
</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="n">full_outer_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="s2">&quot;left&quot;</span><span class="p">)</span>
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="n">anti_join_clause</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</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">where</span><span class="p">(</span><span class="n">join_conditions</span><span class="p">)</span>
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="n">expression_copy</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;joins&quot;</span><span class="p">][</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="s2">&quot;right&quot;</span><span class="p">)</span>
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="n">expression_copy</span> <span class="o">=</span> <span class="n">expression_copy</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">anti_join_clause</span><span class="p">)</span><span class="o">.</span><span class="n">not_</span><span class="p">())</span>
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="n">expression_copy</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="c1"># remove CTEs from RIGHT side</span>
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="c1"># remove order by from LEFT side</span>
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a>
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_copy</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a>
</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a>
</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a>
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_ctes_to_top_level</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">E</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">E</span><span class="p">:</span>
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a><span class="sd"> Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be</span>
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a><span class="sd"> defined at the top-level, so for example queries like:</span>
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a>
</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a><span class="sd"> SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq</span>
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a>
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a><span class="sd"> are invalid in those dialects. This transformation can be used to ensure all CTEs are</span>
</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a><span class="sd"> moved to the top level so that the final SQL code is valid from a syntax standpoint.</span>
</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a>
</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a><span class="sd"> TODO: handle name clashes whilst moving CTEs (it can get quite tricky &amp; costly).</span>
</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="n">top_level_with</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">)</span>
</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="k">for</span> <span class="n">inner_with</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">With</span><span class="p">):</span>
</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="k">continue</span>
</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a>
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">top_level_with</span><span class="p">:</span>
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a> <span class="n">top_level_with</span> <span class="o">=</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="p">)</span>
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a>
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="n">parent_cte</span> <span class="o">=</span> <span class="n">inner_with</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">CTE</span><span class="p">)</span>
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">inner_with</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a>
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a> <span class="k">if</span> <span class="n">parent_cte</span><span class="p">:</span>
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">parent_cte</span><span class="p">)</span>
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span> <span class="o">+</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="p">)</span>
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a>
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a>
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a>
</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_bools</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-721"><a href="#L-721"><span class="linenos">721</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts numeric values used in conditions into explicit boolean expressions.&quot;&quot;&quot;</span>
</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.canonicalize</span><span class="w"> </span><span class="kn">import</span> <span class="n">ensure_bools</span>
</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a>
</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_ensure_bool</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a> <span class="n">node</span><span class="o">.</span><span class="n">is_number</span>
</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a> <span class="ow">or</span> <span class="p">(</span>
</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">SubqueryPredicate</span><span class="p">)</span>
</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">UNKNOWN</span><span class="p">,</span> <span class="o">*</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">NUMERIC_TYPES</span><span class="p">)</span>
</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a> <span class="p">)</span>
</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a> <span class="p">):</span>
</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a> <span class="n">node</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">neq</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a>
</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a> <span class="n">ensure_bools</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">_ensure_bool</span><span class="p">)</span>
</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a>
</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a>
</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a>
</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unqualify_columns</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-742"><a href="#L-742"><span class="linenos">742</span></a> <span class="k">for</span> <span class="n">column</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">Column</span><span class="p">):</span>
</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a> <span class="c1"># We only wanna pop off the table, db, catalog args</span>
</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">column</span><span class="o">.</span><span class="n">parts</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a> <span class="n">part</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a>
</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a>
</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a>
</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_unique_constraints</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-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a> <span class="k">for</span> <span class="n">constraint</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">UniqueColumnConstraint</span><span class="p">):</span>
</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="k">if</span> <span class="n">constraint</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="n">constraint</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a>
</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a>
</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a>
</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ctas_with_tmp_tables_to_create_tmp_view</span><span class="p">(</span>
</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a> <span class="n">tmp_storage_provider</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">e</span><span class="p">,</span>
</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-763"><a href="#L-763"><span class="linenos">763</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a> <span class="n">properties</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;properties&quot;</span><span class="p">)</span>
</span><span id="L-765"><a href="#L-765"><span class="linenos">765</span></a> <span class="n">temporary</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-766"><a href="#L-766"><span class="linenos">766</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">)</span>
</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a> <span class="k">for</span> <span class="n">prop</span> <span class="ow">in</span> <span class="p">(</span><span class="n">properties</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">properties</span> <span class="k">else</span> <span class="p">[])</span>
</span><span id="L-768"><a href="#L-768"><span class="linenos">768</span></a> <span class="p">)</span>
</span><span id="L-769"><a href="#L-769"><span class="linenos">769</span></a>
</span><span id="L-770"><a href="#L-770"><span class="linenos">770</span></a> <span class="c1"># CTAS with temp tables map to CREATE TEMPORARY VIEW</span>
</span><span id="L-771"><a href="#L-771"><span class="linenos">771</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;TABLE&quot;</span> <span class="ow">and</span> <span class="n">temporary</span><span class="p">:</span>
</span><span id="L-772"><a href="#L-772"><span class="linenos">772</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
</span><span id="L-773"><a href="#L-773"><span class="linenos">773</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Create</span><span class="p">(</span>
</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;TEMPORARY VIEW&quot;</span><span class="p">,</span>
</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a> <span class="n">this</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
</span><span id="L-776"><a href="#L-776"><span class="linenos">776</span></a> <span class="n">expression</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span>
</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a> <span class="p">)</span>
</span><span id="L-778"><a href="#L-778"><span class="linenos">778</span></a> <span class="k">return</span> <span class="n">tmp_storage_provider</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-779"><a href="#L-779"><span class="linenos">779</span></a>
</span><span id="L-780"><a href="#L-780"><span class="linenos">780</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-781"><a href="#L-781"><span class="linenos">781</span></a>
</span><span id="L-782"><a href="#L-782"><span class="linenos">782</span></a>
</span><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_schema_columns_to_partitioned_by</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-784"><a href="#L-784"><span class="linenos">784</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a><span class="sd"> In Hive, the PARTITIONED BY property acts as an extension of a table&#39;s schema. When the</span>
</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a><span class="sd"> PARTITIONED BY value is an array of column names, they are transformed into a schema.</span>
</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a><span class="sd"> The corresponding columns are removed from the create statement.</span>
</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a> <span class="n">has_schema</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">)</span>
</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a> <span class="n">is_partitionable</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">kind</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;TABLE&quot;</span><span class="p">,</span> <span class="s2">&quot;VIEW&quot;</span><span class="p">}</span>
</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a>
</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a> <span class="k">if</span> <span class="n">has_schema</span> <span class="ow">and</span> <span class="n">is_partitionable</span><span class="p">:</span>
</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a> <span class="n">prop</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">)</span>
</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a> <span class="k">if</span> <span class="n">prop</span> <span class="ow">and</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">):</span>
</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">}</span>
</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a> <span class="n">partitions</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">schema</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">]</span>
</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">schema</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">e</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">partitions</span><span class="p">])</span>
</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a> <span class="n">prop</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">PartitionedByProperty</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="n">partitions</span><span class="p">)))</span>
</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span>
</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a>
</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-804"><a href="#L-804"><span class="linenos">804</span></a>
</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a>
</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_partitioned_by_to_schema_columns</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-807"><a href="#L-807"><span class="linenos">807</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a><span class="sd"> Spark 3 supports both &quot;HIVEFORMAT&quot; and &quot;DATASOURCE&quot; formats for CREATE TABLE.</span>
</span><span id="L-809"><a href="#L-809"><span class="linenos">809</span></a>
</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a><span class="sd"> Currently, SQLGlot uses the DATASOURCE format for Spark 3.</span>
</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a> <span class="n">prop</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">)</span>
</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-815"><a href="#L-815"><span class="linenos">815</span></a> <span class="n">prop</span>
</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a> <span class="ow">and</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">)</span>
</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">)</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">kind</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-819"><a href="#L-819"><span class="linenos">819</span></a> <span class="p">):</span>
</span><span id="L-820"><a href="#L-820"><span class="linenos">820</span></a> <span class="n">prop_this</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">(</span>
</span><span id="L-821"><a href="#L-821"><span class="linenos">821</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">]</span>
</span><span id="L-822"><a href="#L-822"><span class="linenos">822</span></a> <span class="p">)</span>
</span><span id="L-823"><a href="#L-823"><span class="linenos">823</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-824"><a href="#L-824"><span class="linenos">824</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-825"><a href="#L-825"><span class="linenos">825</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</span><span id="L-826"><a href="#L-826"><span class="linenos">826</span></a> <span class="n">prop</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">prop_this</span><span class="p">)</span>
</span><span id="L-827"><a href="#L-827"><span class="linenos">827</span></a>
</span><span id="L-828"><a href="#L-828"><span class="linenos">828</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-829"><a href="#L-829"><span class="linenos">829</span></a>
</span><span id="L-830"><a href="#L-830"><span class="linenos">830</span></a>
</span><span id="L-831"><a href="#L-831"><span class="linenos">831</span></a><span class="k">def</span><span class="w"> </span><span class="nf">struct_kv_to_alias</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-832"><a href="#L-832"><span class="linenos">832</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts struct arguments to aliases, e.g. STRUCT(1 AS y).&quot;&quot;&quot;</span>
</span><span id="L-833"><a href="#L-833"><span class="linenos">833</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
</span><span id="L-834"><a href="#L-834"><span class="linenos">834</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-835"><a href="#L-835"><span class="linenos">835</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="L-836"><a href="#L-836"><span class="linenos">836</span></a> <span class="p">[</span>
</span><span id="L-837"><a href="#L-837"><span class="linenos">837</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="L-838"><a href="#L-838"><span class="linenos">838</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-839"><a href="#L-839"><span class="linenos">839</span></a> <span class="p">],</span>
</span><span id="L-840"><a href="#L-840"><span class="linenos">840</span></a> <span class="p">)</span>
</span><span id="L-841"><a href="#L-841"><span class="linenos">841</span></a>
</span><span id="L-842"><a href="#L-842"><span class="linenos">842</span></a> <span class="k">return</span> <span class="n">expression</span>
</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><span id="L-845"><a href="#L-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="L-846"><a href="#L-846"><span class="linenos">846</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-847"><a href="#L-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="L-848"><a href="#L-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="L-849"><a href="#L-849"><span class="linenos">849</span></a>
</span><span id="L-850"><a href="#L-850"><span class="linenos">850</span></a><span class="sd"> For example,</span>
</span><span id="L-851"><a href="#L-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="L-852"><a href="#L-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="L-853"><a href="#L-853"><span class="linenos">853</span></a>
</span><span id="L-854"><a href="#L-854"><span class="linenos">854</span></a><span class="sd"> Args:</span>
</span><span id="L-855"><a href="#L-855"><span class="linenos">855</span></a><span class="sd"> expression: The AST to remove join marks from.</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"> Returns:</span>
</span><span id="L-858"><a href="#L-858"><span class="linenos">858</span></a><span class="sd"> The AST with join marks removed.</span>
</span><span id="L-859"><a href="#L-859"><span class="linenos">859</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-860"><a href="#L-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="L-861"><a href="#L-861"><span class="linenos">861</span></a>
</span><span id="L-862"><a href="#L-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="L-863"><a href="#L-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="L-864"><a href="#L-864"><span class="linenos">864</span></a>
</span><span id="L-865"><a href="#L-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="L-866"><a href="#L-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="L-867"><a href="#L-867"><span class="linenos">867</span></a>
</span><span id="L-868"><a href="#L-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="L-869"><a href="#L-869"><span class="linenos">869</span></a> <span class="k">continue</span>
</span><span id="L-870"><a href="#L-870"><span class="linenos">870</span></a>
</span><span id="L-871"><a href="#L-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="L-872"><a href="#L-872"><span class="linenos">872</span></a>
</span><span id="L-873"><a href="#L-873"><span class="linenos">873</span></a> <span class="c1"># These keep track of the joins to be replaced</span>
</span><span id="L-874"><a href="#L-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="L-875"><a href="#L-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="L-876"><a href="#L-876"><span class="linenos">876</span></a>
</span><span id="L-877"><a href="#L-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="L-878"><a href="#L-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="L-879"><a href="#L-879"><span class="linenos">879</span></a> <span class="k">continue</span>
</span><span id="L-880"><a href="#L-880"><span class="linenos">880</span></a>
</span><span id="L-881"><a href="#L-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="L-882"><a href="#L-882"><span class="linenos">882</span></a> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="L-883"><a href="#L-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="L-884"><a href="#L-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="L-885"><a href="#L-885"><span class="linenos">885</span></a>
</span><span id="L-886"><a href="#L-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="L-887"><a href="#L-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="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="n">left_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-890"><a href="#L-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="L-891"><a href="#L-891"><span class="linenos">891</span></a> <span class="p">]</span>
</span><span id="L-892"><a href="#L-892"><span class="linenos">892</span></a> <span class="n">right_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-893"><a href="#L-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="L-894"><a href="#L-894"><span class="linenos">894</span></a> <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="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-897"><a href="#L-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="L-898"><a href="#L-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="L-899"><a href="#L-899"><span class="linenos">899</span></a>
</span><span id="L-900"><a href="#L-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="L-901"><a href="#L-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="L-902"><a href="#L-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="L-903"><a href="#L-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="L-904"><a href="#L-904"><span class="linenos">904</span></a>
</span><span id="L-905"><a href="#L-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="L-906"><a href="#L-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="L-907"><a href="#L-907"><span class="linenos">907</span></a>
</span><span id="L-908"><a href="#L-908"><span class="linenos">908</span></a> <span class="k">assert</span> <span class="p">(</span>
</span><span id="L-909"><a href="#L-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="L-910"><a href="#L-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="L-911"><a href="#L-911"><span class="linenos">911</span></a>
</span><span id="L-912"><a href="#L-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="L-913"><a href="#L-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="L-914"><a href="#L-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="L-915"><a href="#L-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="L-916"><a href="#L-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="L-917"><a href="#L-917"><span class="linenos">917</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-918"><a href="#L-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="L-919"><a href="#L-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="L-920"><a href="#L-920"><span class="linenos">920</span></a> <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="c1"># If the parent of the target predicate is a binary node, then it now has only one child</span>
</span><span id="L-923"><a href="#L-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="L-924"><a href="#L-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="L-925"><a href="#L-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="L-926"><a href="#L-926"><span class="linenos">926</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-927"><a href="#L-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="L-928"><a href="#L-928"><span class="linenos">928</span></a>
</span><span id="L-929"><a href="#L-929"><span class="linenos">929</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-930"><a href="#L-930"><span class="linenos">930</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-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_joins</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_joins</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="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><span id="L-938"><a href="#L-938"><span class="linenos">938</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-939"><a href="#L-939"><span class="linenos">939</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-940"><a href="#L-940"><span class="linenos">940</span></a>
</span><span id="L-941"><a href="#L-941"><span class="linenos">941</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-942"><a href="#L-942"><span class="linenos">942</span></a> <span class="n">where</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-943"><a href="#L-943"><span class="linenos">943</span></a>
</span><span id="L-944"><a href="#L-944"><span class="linenos">944</span></a> <span class="k">return</span> <span class="n">expression</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><span id="L-947"><a href="#L-947"><span class="linenos">947</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-948"><a href="#L-948"><span class="linenos">948</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-949"><a href="#L-949"><span class="linenos">949</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</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="sd"> For example,</span>
</span><span id="L-952"><a href="#L-952"><span class="linenos">952</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="L-953"><a href="#L-953"><span class="linenos">953</span></a><span class="sd"> - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -&gt; x &lt; 5)</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 class="sd"> Both ANY and EXISTS accept queries but currently only array expressions are supported for this</span>
</span><span id="L-956"><a href="#L-956"><span class="linenos">956</span></a><span class="sd"> transformation</span>
</span><span id="L-957"><a href="#L-957"><span class="linenos">957</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-958"><a href="#L-958"><span class="linenos">958</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-959"><a href="#L-959"><span class="linenos">959</span></a> <span class="k">for</span> <span class="nb">any</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-960"><a href="#L-960"><span class="linenos">960</span></a> <span class="n">this</span> <span class="o">=</span> <span class="nb">any</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-961"><a href="#L-961"><span class="linenos">961</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-962"><a href="#L-962"><span class="linenos">962</span></a> <span class="k">continue</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="n">binop</span> <span class="o">=</span> <span class="nb">any</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-965"><a href="#L-965"><span class="linenos">965</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-966"><a href="#L-966"><span class="linenos">966</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-967"><a href="#L-967"><span class="linenos">967</span></a> <span class="nb">any</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-968"><a href="#L-968"><span class="linenos">968</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-969"><a href="#L-969"><span class="linenos">969</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-970"><a href="#L-970"><span class="linenos">970</span></a>
</span><span id="L-971"><a href="#L-971"><span class="linenos">971</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
</section>
<section id="preprocess">
<input id="preprocess-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">preprocess</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">transforms</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Callable</span><span class="p">[[</span><span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">Callable</span><span class="p">[[</span><span class="n"><a href="generator.html#Generator">sqlglot.generator.Generator</a></span><span class="p">,</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="nb">str</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="preprocess-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#preprocess"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-16"><a href="#preprocess-16"><span class="linenos">16</span></a><span class="k">def</span><span class="w"> </span><span class="nf">preprocess</span><span class="p">(</span>
</span><span id="preprocess-17"><a href="#preprocess-17"><span class="linenos">17</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="preprocess-18"><a href="#preprocess-18"><span class="linenos">18</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
</span><span id="preprocess-19"><a href="#preprocess-19"><span class="linenos">19</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="preprocess-20"><a href="#preprocess-20"><span class="linenos">20</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="preprocess-21"><a href="#preprocess-21"><span class="linenos">21</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="preprocess-22"><a href="#preprocess-22"><span class="linenos">22</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="preprocess-23"><a href="#preprocess-23"><span class="linenos">23</span></a>
</span><span id="preprocess-24"><a href="#preprocess-24"><span class="linenos">24</span></a><span class="sd"> Args:</span>
</span><span id="preprocess-25"><a href="#preprocess-25"><span class="linenos">25</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="preprocess-26"><a href="#preprocess-26"><span class="linenos">26</span></a>
</span><span id="preprocess-27"><a href="#preprocess-27"><span class="linenos">27</span></a><span class="sd"> Returns:</span>
</span><span id="preprocess-28"><a href="#preprocess-28"><span class="linenos">28</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="preprocess-29"><a href="#preprocess-29"><span class="linenos">29</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="preprocess-30"><a href="#preprocess-30"><span class="linenos">30</span></a>
</span><span id="preprocess-31"><a href="#preprocess-31"><span class="linenos">31</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="preprocess-32"><a href="#preprocess-32"><span class="linenos">32</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-33"><a href="#preprocess-33"><span class="linenos">33</span></a>
</span><span id="preprocess-34"><a href="#preprocess-34"><span class="linenos">34</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="preprocess-35"><a href="#preprocess-35"><span class="linenos">35</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-36"><a href="#preprocess-36"><span class="linenos">36</span></a> <span class="k">for</span> <span class="n">transform</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="preprocess-37"><a href="#preprocess-37"><span class="linenos">37</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-38"><a href="#preprocess-38"><span class="linenos">38</span></a> <span class="k">except</span> <span class="n">UnsupportedError</span> <span class="k">as</span> <span class="n">unsupported_error</span><span class="p">:</span>
</span><span id="preprocess-39"><a href="#preprocess-39"><span class="linenos">39</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">unsupported_error</span><span class="p">))</span>
</span><span id="preprocess-40"><a href="#preprocess-40"><span class="linenos">40</span></a>
</span><span id="preprocess-41"><a href="#preprocess-41"><span class="linenos">41</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="preprocess-42"><a href="#preprocess-42"><span class="linenos">42</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="preprocess-43"><a href="#preprocess-43"><span class="linenos">43</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-44"><a href="#preprocess-44"><span class="linenos">44</span></a>
</span><span id="preprocess-45"><a href="#preprocess-45"><span class="linenos">45</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="preprocess-46"><a href="#preprocess-46"><span class="linenos">46</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="preprocess-47"><a href="#preprocess-47"><span class="linenos">47</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="preprocess-48"><a href="#preprocess-48"><span class="linenos">48</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">Func</span><span class="p">):</span>
</span><span id="preprocess-49"><a href="#preprocess-49"><span class="linenos">49</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-50"><a href="#preprocess-50"><span class="linenos">50</span></a>
</span><span id="preprocess-51"><a href="#preprocess-51"><span class="linenos">51</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="preprocess-52"><a href="#preprocess-52"><span class="linenos">52</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="preprocess-53"><a href="#preprocess-53"><span class="linenos">53</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="preprocess-54"><a href="#preprocess-54"><span class="linenos">54</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="preprocess-55"><a href="#preprocess-55"><span class="linenos">55</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="preprocess-56"><a href="#preprocess-56"><span class="linenos">56</span></a> <span class="p">)</span>
</span><span id="preprocess-57"><a href="#preprocess-57"><span class="linenos">57</span></a>
</span><span id="preprocess-58"><a href="#preprocess-58"><span class="linenos">58</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-59"><a href="#preprocess-59"><span class="linenos">59</span></a>
</span><span id="preprocess-60"><a href="#preprocess-60"><span class="linenos">60</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="preprocess-61"><a href="#preprocess-61"><span class="linenos">61</span></a>
</span><span id="preprocess-62"><a href="#preprocess-62"><span class="linenos">62</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span></pre></div>
<div class="docstring"><p>Creates a new transform by chaining a sequence of transformations and converts the resulting
expression to SQL, using either the "_sql" method corresponding to the resulting expression,
or the appropriate <code>Generator.TRANSFORMS</code> function (when applicable -- see below).</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>transforms:</strong> sequence of transform functions. These will be called in order.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>Function that can be used as a generator transform.</p>
</blockquote>
</div>
</section>
<section id="unnest_generate_date_array_using_recursive_cte">
<input id="unnest_generate_date_array_using_recursive_cte-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unnest_generate_date_array_using_recursive_cte</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unnest_generate_date_array_using_recursive_cte-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unnest_generate_date_array_using_recursive_cte"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unnest_generate_date_array_using_recursive_cte-65"><a href="#unnest_generate_date_array_using_recursive_cte-65"><span class="linenos"> 65</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_generate_date_array_using_recursive_cte</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="unnest_generate_date_array_using_recursive_cte-66"><a href="#unnest_generate_date_array_using_recursive_cte-66"><span class="linenos"> 66</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="unnest_generate_date_array_using_recursive_cte-67"><a href="#unnest_generate_date_array_using_recursive_cte-67"><span class="linenos"> 67</span></a> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-68"><a href="#unnest_generate_date_array_using_recursive_cte-68"><span class="linenos"> 68</span></a> <span class="n">recursive_ctes</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-69"><a href="#unnest_generate_date_array_using_recursive_cte-69"><span class="linenos"> 69</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-70"><a href="#unnest_generate_date_array_using_recursive_cte-70"><span class="linenos"> 70</span></a> <span class="k">for</span> <span class="n">unnest</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">Unnest</span><span class="p">):</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-71"><a href="#unnest_generate_date_array_using_recursive_cte-71"><span class="linenos"> 71</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-72"><a href="#unnest_generate_date_array_using_recursive_cte-72"><span class="linenos"> 72</span></a> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-73"><a href="#unnest_generate_date_array_using_recursive_cte-73"><span class="linenos"> 73</span></a> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-74"><a href="#unnest_generate_date_array_using_recursive_cte-74"><span class="linenos"> 74</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">GenerateDateArray</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-75"><a href="#unnest_generate_date_array_using_recursive_cte-75"><span class="linenos"> 75</span></a> <span class="p">):</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-76"><a href="#unnest_generate_date_array_using_recursive_cte-76"><span class="linenos"> 76</span></a> <span class="k">continue</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-77"><a href="#unnest_generate_date_array_using_recursive_cte-77"><span class="linenos"> 77</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-78"><a href="#unnest_generate_date_array_using_recursive_cte-78"><span class="linenos"> 78</span></a> <span class="n">generate_date_array</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-79"><a href="#unnest_generate_date_array_using_recursive_cte-79"><span class="linenos"> 79</span></a> <span class="n">start</span> <span class="o">=</span> <span class="n">generate_date_array</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;start&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-80"><a href="#unnest_generate_date_array_using_recursive_cte-80"><span class="linenos"> 80</span></a> <span class="n">end</span> <span class="o">=</span> <span class="n">generate_date_array</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;end&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-81"><a href="#unnest_generate_date_array_using_recursive_cte-81"><span class="linenos"> 81</span></a> <span class="n">step</span> <span class="o">=</span> <span class="n">generate_date_array</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;step&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-82"><a href="#unnest_generate_date_array_using_recursive_cte-82"><span class="linenos"> 82</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-83"><a href="#unnest_generate_date_array_using_recursive_cte-83"><span class="linenos"> 83</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">start</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">end</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Interval</span><span class="p">):</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-84"><a href="#unnest_generate_date_array_using_recursive_cte-84"><span class="linenos"> 84</span></a> <span class="k">continue</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-85"><a href="#unnest_generate_date_array_using_recursive_cte-85"><span class="linenos"> 85</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-86"><a href="#unnest_generate_date_array_using_recursive_cte-86"><span class="linenos"> 86</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-87"><a href="#unnest_generate_date_array_using_recursive_cte-87"><span class="linenos"> 87</span></a> <span class="n">column_name</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;date_value&quot;</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-88"><a href="#unnest_generate_date_array_using_recursive_cte-88"><span class="linenos"> 88</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-89"><a href="#unnest_generate_date_array_using_recursive_cte-89"><span class="linenos"> 89</span></a> <span class="n">start</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-90"><a href="#unnest_generate_date_array_using_recursive_cte-90"><span class="linenos"> 90</span></a> <span class="n">date_add</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-91"><a href="#unnest_generate_date_array_using_recursive_cte-91"><span class="linenos"> 91</span></a> <span class="s2">&quot;date_add&quot;</span><span class="p">,</span> <span class="n">column_name</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">step</span><span class="o">.</span><span class="n">name</span><span class="p">),</span> <span class="n">step</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;unit&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-92"><a href="#unnest_generate_date_array_using_recursive_cte-92"><span class="linenos"> 92</span></a> <span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-93"><a href="#unnest_generate_date_array_using_recursive_cte-93"><span class="linenos"> 93</span></a> <span class="n">cast_date_add</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">date_add</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-94"><a href="#unnest_generate_date_array_using_recursive_cte-94"><span class="linenos"> 94</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-95"><a href="#unnest_generate_date_array_using_recursive_cte-95"><span class="linenos"> 95</span></a> <span class="n">cte_name</span> <span class="o">=</span> <span class="s2">&quot;_generated_dates&quot;</span> <span class="o">+</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;_</span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">count</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-96"><a href="#unnest_generate_date_array_using_recursive_cte-96"><span class="linenos"> 96</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-97"><a href="#unnest_generate_date_array_using_recursive_cte-97"><span class="linenos"> 97</span></a> <span class="n">base_query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">start</span><span class="o">.</span><span class="n">as_</span><span class="p">(</span><span class="n">column_name</span><span class="p">))</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-98"><a href="#unnest_generate_date_array_using_recursive_cte-98"><span class="linenos"> 98</span></a> <span class="n">recursive_query</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-99"><a href="#unnest_generate_date_array_using_recursive_cte-99"><span class="linenos"> 99</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">cast_date_add</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-100"><a href="#unnest_generate_date_array_using_recursive_cte-100"><span class="linenos">100</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">cte_name</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-101"><a href="#unnest_generate_date_array_using_recursive_cte-101"><span class="linenos">101</span></a> <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">cast_date_add</span> <span class="o">&lt;=</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">end</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">))</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-102"><a href="#unnest_generate_date_array_using_recursive_cte-102"><span class="linenos">102</span></a> <span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-103"><a href="#unnest_generate_date_array_using_recursive_cte-103"><span class="linenos">103</span></a> <span class="n">cte_query</span> <span class="o">=</span> <span class="n">base_query</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">recursive_query</span><span class="p">,</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-104"><a href="#unnest_generate_date_array_using_recursive_cte-104"><span class="linenos">104</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-105"><a href="#unnest_generate_date_array_using_recursive_cte-105"><span class="linenos">105</span></a> <span class="n">generate_dates_query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">column_name</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">cte_name</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-106"><a href="#unnest_generate_date_array_using_recursive_cte-106"><span class="linenos">106</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">generate_dates_query</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">cte_name</span><span class="p">))</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-107"><a href="#unnest_generate_date_array_using_recursive_cte-107"><span class="linenos">107</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-108"><a href="#unnest_generate_date_array_using_recursive_cte-108"><span class="linenos">108</span></a> <span class="n">recursive_ctes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-109"><a href="#unnest_generate_date_array_using_recursive_cte-109"><span class="linenos">109</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">cte_query</span><span class="p">),</span> <span class="n">cte_name</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">column_name</span><span class="p">])</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-110"><a href="#unnest_generate_date_array_using_recursive_cte-110"><span class="linenos">110</span></a> <span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-111"><a href="#unnest_generate_date_array_using_recursive_cte-111"><span class="linenos">111</span></a> <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-112"><a href="#unnest_generate_date_array_using_recursive_cte-112"><span class="linenos">112</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-113"><a href="#unnest_generate_date_array_using_recursive_cte-113"><span class="linenos">113</span></a> <span class="k">if</span> <span class="n">recursive_ctes</span><span class="p">:</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-114"><a href="#unnest_generate_date_array_using_recursive_cte-114"><span class="linenos">114</span></a> <span class="n">with_expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">()</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-115"><a href="#unnest_generate_date_array_using_recursive_cte-115"><span class="linenos">115</span></a> <span class="n">with_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-116"><a href="#unnest_generate_date_array_using_recursive_cte-116"><span class="linenos">116</span></a> <span class="n">with_expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="o">*</span><span class="n">recursive_ctes</span><span class="p">,</span> <span class="o">*</span><span class="n">with_expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">])</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-117"><a href="#unnest_generate_date_array_using_recursive_cte-117"><span class="linenos">117</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="n">with_expression</span><span class="p">)</span>
</span><span id="unnest_generate_date_array_using_recursive_cte-118"><a href="#unnest_generate_date_array_using_recursive_cte-118"><span class="linenos">118</span></a>
</span><span id="unnest_generate_date_array_using_recursive_cte-119"><a href="#unnest_generate_date_array_using_recursive_cte-119"><span class="linenos">119</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
</section>
<section id="unnest_generate_series">
<input id="unnest_generate_series-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unnest_generate_series</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unnest_generate_series-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unnest_generate_series"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unnest_generate_series-122"><a href="#unnest_generate_series-122"><span class="linenos">122</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_generate_series</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="unnest_generate_series-123"><a href="#unnest_generate_series-123"><span class="linenos">123</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Unnests GENERATE_SERIES or SEQUENCE table references.&quot;&quot;&quot;</span>
</span><span id="unnest_generate_series-124"><a href="#unnest_generate_series-124"><span class="linenos">124</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="unnest_generate_series-125"><a href="#unnest_generate_series-125"><span class="linenos">125</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span> <span class="ow">and</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">GenerateSeries</span><span class="p">):</span>
</span><span id="unnest_generate_series-126"><a href="#unnest_generate_series-126"><span class="linenos">126</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">this</span><span class="p">])</span>
</span><span id="unnest_generate_series-127"><a href="#unnest_generate_series-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
</span><span id="unnest_generate_series-128"><a href="#unnest_generate_series-128"><span class="linenos">128</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_u&quot;</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">],</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="unnest_generate_series-129"><a href="#unnest_generate_series-129"><span class="linenos">129</span></a>
</span><span id="unnest_generate_series-130"><a href="#unnest_generate_series-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="n">unnest</span>
</span><span id="unnest_generate_series-131"><a href="#unnest_generate_series-131"><span class="linenos">131</span></a>
</span><span id="unnest_generate_series-132"><a href="#unnest_generate_series-132"><span class="linenos">132</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Unnests GENERATE_SERIES or SEQUENCE table references.</p>
</div>
</section>
<section id="unalias_group">
<input id="unalias_group-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unalias_group</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unalias_group-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unalias_group"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unalias_group-135"><a href="#unalias_group-135"><span class="linenos">135</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unalias_group</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="unalias_group-136"><a href="#unalias_group-136"><span class="linenos">136</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="unalias_group-137"><a href="#unalias_group-137"><span class="linenos">137</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="unalias_group-138"><a href="#unalias_group-138"><span class="linenos">138</span></a>
</span><span id="unalias_group-139"><a href="#unalias_group-139"><span class="linenos">139</span></a><span class="sd"> Example:</span>
</span><span id="unalias_group-140"><a href="#unalias_group-140"><span class="linenos">140</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="unalias_group-141"><a href="#unalias_group-141"><span class="linenos">141</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="unalias_group-142"><a href="#unalias_group-142"><span class="linenos">142</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="unalias_group-143"><a href="#unalias_group-143"><span class="linenos">143</span></a>
</span><span id="unalias_group-144"><a href="#unalias_group-144"><span class="linenos">144</span></a><span class="sd"> Args:</span>
</span><span id="unalias_group-145"><a href="#unalias_group-145"><span class="linenos">145</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="unalias_group-146"><a href="#unalias_group-146"><span class="linenos">146</span></a>
</span><span id="unalias_group-147"><a href="#unalias_group-147"><span class="linenos">147</span></a><span class="sd"> Returns:</span>
</span><span id="unalias_group-148"><a href="#unalias_group-148"><span class="linenos">148</span></a><span class="sd"> The transformed expression.</span>
</span><span id="unalias_group-149"><a href="#unalias_group-149"><span class="linenos">149</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="unalias_group-150"><a href="#unalias_group-150"><span class="linenos">150</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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="unalias_group-151"><a href="#unalias_group-151"><span class="linenos">151</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="unalias_group-152"><a href="#unalias_group-152"><span class="linenos">152</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="unalias_group-153"><a href="#unalias_group-153"><span class="linenos">153</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="unalias_group-154"><a href="#unalias_group-154"><span class="linenos">154</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="unalias_group-155"><a href="#unalias_group-155"><span class="linenos">155</span></a> <span class="p">}</span>
</span><span id="unalias_group-156"><a href="#unalias_group-156"><span class="linenos">156</span></a>
</span><span id="unalias_group-157"><a href="#unalias_group-157"><span class="linenos">157</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="unalias_group-158"><a href="#unalias_group-158"><span class="linenos">158</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="unalias_group-159"><a href="#unalias_group-159"><span class="linenos">159</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
</span><span id="unalias_group-160"><a href="#unalias_group-160"><span class="linenos">160</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="unalias_group-161"><a href="#unalias_group-161"><span class="linenos">161</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="unalias_group-162"><a href="#unalias_group-162"><span class="linenos">162</span></a> <span class="p">):</span>
</span><span id="unalias_group-163"><a href="#unalias_group-163"><span class="linenos">163</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="unalias_group-164"><a href="#unalias_group-164"><span class="linenos">164</span></a>
</span><span id="unalias_group-165"><a href="#unalias_group-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Replace references to select aliases in GROUP BY clauses.</p>
<h6 id="example">Example:</h6>
<blockquote>
<div class="pdoc-code codehilite">
<pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span><span class="w"> </span><span class="nn">sqlglot</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n"><a href="../sqlglot.html#parse_one">sqlglot.parse_one</a></span><span class="p">(</span><span class="s2">&quot;SELECT a AS b FROM x GROUP BY b&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">unalias_group</span><span class="p">)</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span>
<span class="go">&#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</code></pre>
</div>
</blockquote>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>expression:</strong> the expression that will be transformed.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The transformed expression.</p>
</blockquote>
</div>
</section>
<section id="eliminate_distinct_on">
<input id="eliminate_distinct_on-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_distinct_on</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_distinct_on-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_distinct_on"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_distinct_on-168"><a href="#eliminate_distinct_on-168"><span class="linenos">168</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_distinct_on</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_distinct_on-169"><a href="#eliminate_distinct_on-169"><span class="linenos">169</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-170"><a href="#eliminate_distinct_on-170"><span class="linenos">170</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</span>
</span><span id="eliminate_distinct_on-171"><a href="#eliminate_distinct_on-171"><span class="linenos">171</span></a>
</span><span id="eliminate_distinct_on-172"><a href="#eliminate_distinct_on-172"><span class="linenos">172</span></a><span class="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="eliminate_distinct_on-173"><a href="#eliminate_distinct_on-173"><span class="linenos">173</span></a>
</span><span id="eliminate_distinct_on-174"><a href="#eliminate_distinct_on-174"><span class="linenos">174</span></a><span class="sd"> Args:</span>
</span><span id="eliminate_distinct_on-175"><a href="#eliminate_distinct_on-175"><span class="linenos">175</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="eliminate_distinct_on-176"><a href="#eliminate_distinct_on-176"><span class="linenos">176</span></a>
</span><span id="eliminate_distinct_on-177"><a href="#eliminate_distinct_on-177"><span class="linenos">177</span></a><span class="sd"> Returns:</span>
</span><span id="eliminate_distinct_on-178"><a href="#eliminate_distinct_on-178"><span class="linenos">178</span></a><span class="sd"> The transformed expression.</span>
</span><span id="eliminate_distinct_on-179"><a href="#eliminate_distinct_on-179"><span class="linenos">179</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-180"><a href="#eliminate_distinct_on-180"><span class="linenos">180</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="eliminate_distinct_on-181"><a href="#eliminate_distinct_on-181"><span class="linenos">181</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-182"><a href="#eliminate_distinct_on-182"><span class="linenos">182</span></a> <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;distinct&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-183"><a href="#eliminate_distinct_on-183"><span class="linenos">183</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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;on&quot;</span><span class="p">),</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-184"><a href="#eliminate_distinct_on-184"><span class="linenos">184</span></a> <span class="p">):</span>
</span><span id="eliminate_distinct_on-185"><a href="#eliminate_distinct_on-185"><span class="linenos">185</span></a> <span class="n">row_number_window_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-186"><a href="#eliminate_distinct_on-186"><span class="linenos">186</span></a>
</span><span id="eliminate_distinct_on-187"><a href="#eliminate_distinct_on-187"><span class="linenos">187</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</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="o">.</span><span class="n">expressions</span>
</span><span id="eliminate_distinct_on-188"><a href="#eliminate_distinct_on-188"><span class="linenos">188</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-189"><a href="#eliminate_distinct_on-189"><span class="linenos">189</span></a>
</span><span id="eliminate_distinct_on-190"><a href="#eliminate_distinct_on-190"><span class="linenos">190</span></a> <span class="n">order</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-191"><a href="#eliminate_distinct_on-191"><span class="linenos">191</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-192"><a href="#eliminate_distinct_on-192"><span class="linenos">192</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">order</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
</span><span id="eliminate_distinct_on-193"><a href="#eliminate_distinct_on-193"><span class="linenos">193</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-194"><a href="#eliminate_distinct_on-194"><span class="linenos">194</span></a> <span class="n">window</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">distinct_cols</span><span class="p">]))</span>
</span><span id="eliminate_distinct_on-195"><a href="#eliminate_distinct_on-195"><span class="linenos">195</span></a>
</span><span id="eliminate_distinct_on-196"><a href="#eliminate_distinct_on-196"><span class="linenos">196</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number_window_alias</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-197"><a href="#eliminate_distinct_on-197"><span class="linenos">197</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-198"><a href="#eliminate_distinct_on-198"><span class="linenos">198</span></a>
</span><span id="eliminate_distinct_on-199"><a href="#eliminate_distinct_on-199"><span class="linenos">199</span></a> <span class="c1"># We add aliases to the projections so that we can safely reference them in the outer query</span>
</span><span id="eliminate_distinct_on-200"><a href="#eliminate_distinct_on-200"><span class="linenos">200</span></a> <span class="n">new_selects</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="eliminate_distinct_on-201"><a href="#eliminate_distinct_on-201"><span class="linenos">201</span></a> <span class="n">taken_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">row_number_window_alias</span><span class="p">}</span>
</span><span id="eliminate_distinct_on-202"><a href="#eliminate_distinct_on-202"><span class="linenos">202</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
</span><span id="eliminate_distinct_on-203"><a href="#eliminate_distinct_on-203"><span class="linenos">203</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">is_star</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-204"><a href="#eliminate_distinct_on-204"><span class="linenos">204</span></a> <span class="n">new_selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Star</span><span class="p">()]</span>
</span><span id="eliminate_distinct_on-205"><a href="#eliminate_distinct_on-205"><span class="linenos">205</span></a> <span class="k">break</span>
</span><span id="eliminate_distinct_on-206"><a href="#eliminate_distinct_on-206"><span class="linenos">206</span></a>
</span><span id="eliminate_distinct_on-207"><a href="#eliminate_distinct_on-207"><span class="linenos">207</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">):</span>
</span><span id="eliminate_distinct_on-208"><a href="#eliminate_distinct_on-208"><span class="linenos">208</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_names</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">output_name</span> <span class="ow">or</span> <span class="s2">&quot;_col&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-209"><a href="#eliminate_distinct_on-209"><span class="linenos">209</span></a> <span class="n">quoted</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;quoted&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="eliminate_distinct_on-210"><a href="#eliminate_distinct_on-210"><span class="linenos">210</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="n">quoted</span><span class="p">))</span>
</span><span id="eliminate_distinct_on-211"><a href="#eliminate_distinct_on-211"><span class="linenos">211</span></a>
</span><span id="eliminate_distinct_on-212"><a href="#eliminate_distinct_on-212"><span class="linenos">212</span></a> <span class="n">taken_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-213"><a href="#eliminate_distinct_on-213"><span class="linenos">213</span></a> <span class="n">new_selects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">])</span>
</span><span id="eliminate_distinct_on-214"><a href="#eliminate_distinct_on-214"><span class="linenos">214</span></a>
</span><span id="eliminate_distinct_on-215"><a href="#eliminate_distinct_on-215"><span class="linenos">215</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="eliminate_distinct_on-216"><a href="#eliminate_distinct_on-216"><span class="linenos">216</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">new_selects</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-217"><a href="#eliminate_distinct_on-217"><span class="linenos">217</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">&quot;_t&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-218"><a href="#eliminate_distinct_on-218"><span class="linenos">218</span></a> <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">row_number_window_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-219"><a href="#eliminate_distinct_on-219"><span class="linenos">219</span></a> <span class="p">)</span>
</span><span id="eliminate_distinct_on-220"><a href="#eliminate_distinct_on-220"><span class="linenos">220</span></a>
</span><span id="eliminate_distinct_on-221"><a href="#eliminate_distinct_on-221"><span class="linenos">221</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert SELECT DISTINCT ON statements to a subquery with a window function.</p>
<p>This is useful for dialects that don't support SELECT DISTINCT ON but support window functions.</p>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>expression:</strong> the expression that will be transformed.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The transformed expression.</p>
</blockquote>
</div>
</section>
<section id="eliminate_qualify">
<input id="eliminate_qualify-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_qualify</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_qualify-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_qualify"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_qualify-224"><a href="#eliminate_qualify-224"><span class="linenos">224</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_qualify</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_qualify-225"><a href="#eliminate_qualify-225"><span class="linenos">225</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_qualify-226"><a href="#eliminate_qualify-226"><span class="linenos">226</span></a><span class="sd"> Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</span>
</span><span id="eliminate_qualify-227"><a href="#eliminate_qualify-227"><span class="linenos">227</span></a>
</span><span id="eliminate_qualify-228"><a href="#eliminate_qualify-228"><span class="linenos">228</span></a><span class="sd"> The idea behind this transformation can be seen in Snowflake&#39;s documentation for QUALIFY:</span>
</span><span id="eliminate_qualify-229"><a href="#eliminate_qualify-229"><span class="linenos">229</span></a><span class="sd"> https://docs.snowflake.com/en/sql-reference/constructs/qualify</span>
</span><span id="eliminate_qualify-230"><a href="#eliminate_qualify-230"><span class="linenos">230</span></a>
</span><span id="eliminate_qualify-231"><a href="#eliminate_qualify-231"><span class="linenos">231</span></a><span class="sd"> Some dialects don&#39;t support window functions in the WHERE clause, so we need to include them as</span>
</span><span id="eliminate_qualify-232"><a href="#eliminate_qualify-232"><span class="linenos">232</span></a><span class="sd"> projections in the subquery, in order to refer to them in the outer filter using aliases. Also,</span>
</span><span id="eliminate_qualify-233"><a href="#eliminate_qualify-233"><span class="linenos">233</span></a><span class="sd"> if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,</span>
</span><span id="eliminate_qualify-234"><a href="#eliminate_qualify-234"><span class="linenos">234</span></a><span class="sd"> otherwise we won&#39;t be able to refer to it in the outer query&#39;s WHERE clause. Finally, if a</span>
</span><span id="eliminate_qualify-235"><a href="#eliminate_qualify-235"><span class="linenos">235</span></a><span class="sd"> newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the</span>
</span><span id="eliminate_qualify-236"><a href="#eliminate_qualify-236"><span class="linenos">236</span></a><span class="sd"> corresponding expression to avoid creating invalid column references.</span>
</span><span id="eliminate_qualify-237"><a href="#eliminate_qualify-237"><span class="linenos">237</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_qualify-238"><a href="#eliminate_qualify-238"><span class="linenos">238</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;qualify&quot;</span><span class="p">):</span>
</span><span id="eliminate_qualify-239"><a href="#eliminate_qualify-239"><span class="linenos">239</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="eliminate_qualify-240"><a href="#eliminate_qualify-240"><span class="linenos">240</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
</span><span id="eliminate_qualify-241"><a href="#eliminate_qualify-241"><span class="linenos">241</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="eliminate_qualify-242"><a href="#eliminate_qualify-242"><span class="linenos">242</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">,</span> <span class="s2">&quot;_c&quot;</span><span class="p">)</span>
</span><span id="eliminate_qualify-243"><a href="#eliminate_qualify-243"><span class="linenos">243</span></a> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">alias</span><span class="p">))</span>
</span><span id="eliminate_qualify-244"><a href="#eliminate_qualify-244"><span class="linenos">244</span></a> <span class="n">taken</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="eliminate_qualify-245"><a href="#eliminate_qualify-245"><span class="linenos">245</span></a>
</span><span id="eliminate_qualify-246"><a href="#eliminate_qualify-246"><span class="linenos">246</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_select_alias_or_name</span><span class="p">(</span><span class="n">select</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">:</span>
</span><span id="eliminate_qualify-247"><a href="#eliminate_qualify-247"><span class="linenos">247</span></a> <span class="n">alias_or_name</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="eliminate_qualify-248"><a href="#eliminate_qualify-248"><span class="linenos">248</span></a> <span class="n">identifier</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
</span><span id="eliminate_qualify-249"><a href="#eliminate_qualify-249"><span class="linenos">249</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">identifier</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">):</span>
</span><span id="eliminate_qualify-250"><a href="#eliminate_qualify-250"><span class="linenos">250</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="n">identifier</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;quoted&quot;</span><span class="p">))</span>
</span><span id="eliminate_qualify-251"><a href="#eliminate_qualify-251"><span class="linenos">251</span></a> <span class="k">return</span> <span class="n">alias_or_name</span>
</span><span id="eliminate_qualify-252"><a href="#eliminate_qualify-252"><span class="linenos">252</span></a>
</span><span id="eliminate_qualify-253"><a href="#eliminate_qualify-253"><span class="linenos">253</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">_select_alias_or_name</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">)))</span>
</span><span id="eliminate_qualify-254"><a href="#eliminate_qualify-254"><span class="linenos">254</span></a> <span class="n">qualify_filters</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;qualify&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">this</span>
</span><span id="eliminate_qualify-255"><a href="#eliminate_qualify-255"><span class="linenos">255</span></a> <span class="n">expression_by_alias</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="eliminate_qualify-256"><a href="#eliminate_qualify-256"><span class="linenos">256</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
</span><span id="eliminate_qualify-257"><a href="#eliminate_qualify-257"><span class="linenos">257</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="eliminate_qualify-258"><a href="#eliminate_qualify-258"><span class="linenos">258</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="eliminate_qualify-259"><a href="#eliminate_qualify-259"><span class="linenos">259</span></a> <span class="p">}</span>
</span><span id="eliminate_qualify-260"><a href="#eliminate_qualify-260"><span class="linenos">260</span></a>
</span><span id="eliminate_qualify-261"><a href="#eliminate_qualify-261"><span class="linenos">261</span></a> <span class="n">select_candidates</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">is_star</span> <span class="k">else</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Window</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_qualify-262"><a href="#eliminate_qualify-262"><span class="linenos">262</span></a> <span class="k">for</span> <span class="n">select_candidate</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">qualify_filters</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">select_candidates</span><span class="p">)):</span>
</span><span id="eliminate_qualify-263"><a href="#eliminate_qualify-263"><span class="linenos">263</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select_candidate</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_qualify-264"><a href="#eliminate_qualify-264"><span class="linenos">264</span></a> <span class="k">if</span> <span class="n">expression_by_alias</span><span class="p">:</span>
</span><span id="eliminate_qualify-265"><a href="#eliminate_qualify-265"><span class="linenos">265</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">select_candidate</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_qualify-266"><a href="#eliminate_qualify-266"><span class="linenos">266</span></a> <span class="n">expr</span> <span class="o">=</span> <span class="n">expression_by_alias</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="eliminate_qualify-267"><a href="#eliminate_qualify-267"><span class="linenos">267</span></a> <span class="k">if</span> <span class="n">expr</span><span class="p">:</span>
</span><span id="eliminate_qualify-268"><a href="#eliminate_qualify-268"><span class="linenos">268</span></a> <span class="n">column</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
</span><span id="eliminate_qualify-269"><a href="#eliminate_qualify-269"><span class="linenos">269</span></a>
</span><span id="eliminate_qualify-270"><a href="#eliminate_qualify-270"><span class="linenos">270</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_w&quot;</span><span class="p">)</span>
</span><span id="eliminate_qualify-271"><a href="#eliminate_qualify-271"><span class="linenos">271</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">select_candidate</span><span class="p">,</span> <span class="n">alias</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_qualify-272"><a href="#eliminate_qualify-272"><span class="linenos">272</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="eliminate_qualify-273"><a href="#eliminate_qualify-273"><span class="linenos">273</span></a>
</span><span id="eliminate_qualify-274"><a href="#eliminate_qualify-274"><span class="linenos">274</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select_candidate</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">Qualify</span><span class="p">):</span>
</span><span id="eliminate_qualify-275"><a href="#eliminate_qualify-275"><span class="linenos">275</span></a> <span class="n">qualify_filters</span> <span class="o">=</span> <span class="n">column</span>
</span><span id="eliminate_qualify-276"><a href="#eliminate_qualify-276"><span class="linenos">276</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="eliminate_qualify-277"><a href="#eliminate_qualify-277"><span class="linenos">277</span></a> <span class="n">select_candidate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="eliminate_qualify-278"><a href="#eliminate_qualify-278"><span class="linenos">278</span></a> <span class="k">elif</span> <span class="n">select_candidate</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">:</span>
</span><span id="eliminate_qualify-279"><a href="#eliminate_qualify-279"><span class="linenos">279</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">select_candidate</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_qualify-280"><a href="#eliminate_qualify-280"><span class="linenos">280</span></a>
</span><span id="eliminate_qualify-281"><a href="#eliminate_qualify-281"><span class="linenos">281</span></a> <span class="k">return</span> <span class="n">outer_selects</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_t&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
</span><span id="eliminate_qualify-282"><a href="#eliminate_qualify-282"><span class="linenos">282</span></a> <span class="n">qualify_filters</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
</span><span id="eliminate_qualify-283"><a href="#eliminate_qualify-283"><span class="linenos">283</span></a> <span class="p">)</span>
</span><span id="eliminate_qualify-284"><a href="#eliminate_qualify-284"><span class="linenos">284</span></a>
</span><span id="eliminate_qualify-285"><a href="#eliminate_qualify-285"><span class="linenos">285</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</p>
<p>The idea behind this transformation can be seen in Snowflake's documentation for QUALIFY:
<a href="https://docs.snowflake.com/en/sql-reference/constructs/qualify">https://docs.snowflake.com/en/sql-reference/constructs/qualify</a></p>
<p>Some dialects don't support window functions in the WHERE clause, so we need to include them as
projections in the subquery, in order to refer to them in the outer filter using aliases. Also,
if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,
otherwise we won't be able to refer to it in the outer query's WHERE clause. Finally, if a
newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the
corresponding expression to avoid creating invalid column references.</p>
</div>
</section>
<section id="remove_precision_parameterized_types">
<input id="remove_precision_parameterized_types-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">remove_precision_parameterized_types</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="remove_precision_parameterized_types-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#remove_precision_parameterized_types"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_precision_parameterized_types-288"><a href="#remove_precision_parameterized_types-288"><span class="linenos">288</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_precision_parameterized_types</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="remove_precision_parameterized_types-289"><a href="#remove_precision_parameterized_types-289"><span class="linenos">289</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-290"><a href="#remove_precision_parameterized_types-290"><span class="linenos">290</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in</span>
</span><span id="remove_precision_parameterized_types-291"><a href="#remove_precision_parameterized_types-291"><span class="linenos">291</span></a><span class="sd"> other expressions. This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="remove_precision_parameterized_types-292"><a href="#remove_precision_parameterized_types-292"><span class="linenos">292</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-293"><a href="#remove_precision_parameterized_types-293"><span class="linenos">293</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">):</span>
</span><span id="remove_precision_parameterized_types-294"><a href="#remove_precision_parameterized_types-294"><span class="linenos">294</span></a> <span class="n">node</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="remove_precision_parameterized_types-295"><a href="#remove_precision_parameterized_types-295"><span class="linenos">295</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataTypeParam</span><span class="p">)]</span>
</span><span id="remove_precision_parameterized_types-296"><a href="#remove_precision_parameterized_types-296"><span class="linenos">296</span></a> <span class="p">)</span>
</span><span id="remove_precision_parameterized_types-297"><a href="#remove_precision_parameterized_types-297"><span class="linenos">297</span></a>
</span><span id="remove_precision_parameterized_types-298"><a href="#remove_precision_parameterized_types-298"><span class="linenos">298</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Some dialects only allow the precision for parameterized types to be defined in the DDL and not in
other expressions. This transforms removes the precision from parameterized types in expressions.</p>
</div>
</section>
<section id="unqualify_unnest">
<input id="unqualify_unnest-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unqualify_unnest</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unqualify_unnest-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unqualify_unnest"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unqualify_unnest-301"><a href="#unqualify_unnest-301"><span class="linenos">301</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unqualify_unnest</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="unqualify_unnest-302"><a href="#unqualify_unnest-302"><span class="linenos">302</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove references to unnest table aliases, added by the optimizer&#39;s qualify_columns step.&quot;&quot;&quot;</span>
</span><span id="unqualify_unnest-303"><a href="#unqualify_unnest-303"><span class="linenos">303</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="unqualify_unnest-304"><a href="#unqualify_unnest-304"><span class="linenos">304</span></a>
</span><span id="unqualify_unnest-305"><a href="#unqualify_unnest-305"><span class="linenos">305</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="unqualify_unnest-306"><a href="#unqualify_unnest-306"><span class="linenos">306</span></a> <span class="n">unnest_aliases</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="unqualify_unnest-307"><a href="#unqualify_unnest-307"><span class="linenos">307</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">alias</span>
</span><span id="unqualify_unnest-308"><a href="#unqualify_unnest-308"><span class="linenos">308</span></a> <span class="k">for</span> <span class="n">unnest</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">Unnest</span><span class="p">)</span>
</span><span id="unqualify_unnest-309"><a href="#unqualify_unnest-309"><span class="linenos">309</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
</span><span id="unqualify_unnest-310"><a href="#unqualify_unnest-310"><span class="linenos">310</span></a> <span class="p">}</span>
</span><span id="unqualify_unnest-311"><a href="#unqualify_unnest-311"><span class="linenos">311</span></a> <span class="k">if</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="unqualify_unnest-312"><a href="#unqualify_unnest-312"><span class="linenos">312</span></a> <span class="k">for</span> <span class="n">column</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">Column</span><span class="p">):</span>
</span><span id="unqualify_unnest-313"><a href="#unqualify_unnest-313"><span class="linenos">313</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="ow">in</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="unqualify_unnest-314"><a href="#unqualify_unnest-314"><span class="linenos">314</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;table&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="unqualify_unnest-315"><a href="#unqualify_unnest-315"><span class="linenos">315</span></a> <span class="k">elif</span> <span class="n">column</span><span class="o">.</span><span class="n">db</span> <span class="ow">in</span> <span class="n">unnest_aliases</span><span class="p">:</span>
</span><span id="unqualify_unnest-316"><a href="#unqualify_unnest-316"><span class="linenos">316</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;db&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="unqualify_unnest-317"><a href="#unqualify_unnest-317"><span class="linenos">317</span></a>
</span><span id="unqualify_unnest-318"><a href="#unqualify_unnest-318"><span class="linenos">318</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Remove references to unnest table aliases, added by the optimizer's qualify_columns step.</p>
</div>
</section>
<section id="unnest_to_explode">
<input id="unnest_to_explode-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unnest_to_explode</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>,</span><span class="param"> <span class="n">unnest_using_arrays_zip</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unnest_to_explode-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unnest_to_explode"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unnest_to_explode-321"><a href="#unnest_to_explode-321"><span class="linenos">321</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unnest_to_explode</span><span class="p">(</span>
</span><span id="unnest_to_explode-322"><a href="#unnest_to_explode-322"><span class="linenos">322</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="unnest_to_explode-323"><a href="#unnest_to_explode-323"><span class="linenos">323</span></a> <span class="n">unnest_using_arrays_zip</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="unnest_to_explode-324"><a href="#unnest_to_explode-324"><span class="linenos">324</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="unnest_to_explode-325"><a href="#unnest_to_explode-325"><span class="linenos">325</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert cross join unnest into lateral view explode.&quot;&quot;&quot;</span>
</span><span id="unnest_to_explode-326"><a href="#unnest_to_explode-326"><span class="linenos">326</span></a>
</span><span id="unnest_to_explode-327"><a href="#unnest_to_explode-327"><span class="linenos">327</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_unnest_zip_exprs</span><span class="p">(</span>
</span><span id="unnest_to_explode-328"><a href="#unnest_to_explode-328"><span class="linenos">328</span></a> <span class="n">u</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">,</span> <span class="n">unnest_exprs</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">has_multi_expr</span><span class="p">:</span> <span class="nb">bool</span>
</span><span id="unnest_to_explode-329"><a href="#unnest_to_explode-329"><span class="linenos">329</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="unnest_to_explode-330"><a href="#unnest_to_explode-330"><span class="linenos">330</span></a> <span class="k">if</span> <span class="n">has_multi_expr</span><span class="p">:</span>
</span><span id="unnest_to_explode-331"><a href="#unnest_to_explode-331"><span class="linenos">331</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">unnest_using_arrays_zip</span><span class="p">:</span>
</span><span id="unnest_to_explode-332"><a href="#unnest_to_explode-332"><span class="linenos">332</span></a> <span class="k">raise</span> <span class="n">UnsupportedError</span><span class="p">(</span><span class="s2">&quot;Cannot transpile UNNEST with multiple input arrays&quot;</span><span class="p">)</span>
</span><span id="unnest_to_explode-333"><a href="#unnest_to_explode-333"><span class="linenos">333</span></a>
</span><span id="unnest_to_explode-334"><a href="#unnest_to_explode-334"><span class="linenos">334</span></a> <span class="c1"># Use INLINE(ARRAYS_ZIP(...)) for multiple expressions</span>
</span><span id="unnest_to_explode-335"><a href="#unnest_to_explode-335"><span class="linenos">335</span></a> <span class="n">zip_exprs</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">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="unnest_to_explode-336"><a href="#unnest_to_explode-336"><span class="linenos">336</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Anonymous</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="s2">&quot;ARRAYS_ZIP&quot;</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">unnest_exprs</span><span class="p">)</span>
</span><span id="unnest_to_explode-337"><a href="#unnest_to_explode-337"><span class="linenos">337</span></a> <span class="p">]</span>
</span><span id="unnest_to_explode-338"><a href="#unnest_to_explode-338"><span class="linenos">338</span></a> <span class="n">u</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">zip_exprs</span><span class="p">)</span>
</span><span id="unnest_to_explode-339"><a href="#unnest_to_explode-339"><span class="linenos">339</span></a> <span class="k">return</span> <span class="n">zip_exprs</span>
</span><span id="unnest_to_explode-340"><a href="#unnest_to_explode-340"><span class="linenos">340</span></a> <span class="k">return</span> <span class="n">unnest_exprs</span>
</span><span id="unnest_to_explode-341"><a href="#unnest_to_explode-341"><span class="linenos">341</span></a>
</span><span id="unnest_to_explode-342"><a href="#unnest_to_explode-342"><span class="linenos">342</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_udtf_type</span><span class="p">(</span><span class="n">u</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Func</span><span class="p">]:</span>
</span><span id="unnest_to_explode-343"><a href="#unnest_to_explode-343"><span class="linenos">343</span></a> <span class="k">if</span> <span class="n">u</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;offset&quot;</span><span class="p">):</span>
</span><span id="unnest_to_explode-344"><a href="#unnest_to_explode-344"><span class="linenos">344</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span>
</span><span id="unnest_to_explode-345"><a href="#unnest_to_explode-345"><span class="linenos">345</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Inline</span> <span class="k">if</span> <span class="n">has_multi_expr</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span>
</span><span id="unnest_to_explode-346"><a href="#unnest_to_explode-346"><span class="linenos">346</span></a>
</span><span id="unnest_to_explode-347"><a href="#unnest_to_explode-347"><span class="linenos">347</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="unnest_to_explode-348"><a href="#unnest_to_explode-348"><span class="linenos">348</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">)</span>
</span><span id="unnest_to_explode-349"><a href="#unnest_to_explode-349"><span class="linenos">349</span></a>
</span><span id="unnest_to_explode-350"><a href="#unnest_to_explode-350"><span class="linenos">350</span></a> <span class="k">if</span> <span class="n">from_</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
</span><span id="unnest_to_explode-351"><a href="#unnest_to_explode-351"><span class="linenos">351</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">from_</span><span class="o">.</span><span class="n">this</span>
</span><span id="unnest_to_explode-352"><a href="#unnest_to_explode-352"><span class="linenos">352</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="unnest_to_explode-353"><a href="#unnest_to_explode-353"><span class="linenos">353</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="unnest_to_explode-354"><a href="#unnest_to_explode-354"><span class="linenos">354</span></a> <span class="n">has_multi_expr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">exprs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="unnest_to_explode-355"><a href="#unnest_to_explode-355"><span class="linenos">355</span></a> <span class="n">this</span><span class="p">,</span> <span class="o">*</span><span class="n">expressions</span> <span class="o">=</span> <span class="n">_unnest_zip_exprs</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exprs</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)</span>
</span><span id="unnest_to_explode-356"><a href="#unnest_to_explode-356"><span class="linenos">356</span></a>
</span><span id="unnest_to_explode-357"><a href="#unnest_to_explode-357"><span class="linenos">357</span></a> <span class="n">unnest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span>
</span><span id="unnest_to_explode-358"><a href="#unnest_to_explode-358"><span class="linenos">358</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">(</span>
</span><span id="unnest_to_explode-359"><a href="#unnest_to_explode-359"><span class="linenos">359</span></a> <span class="n">this</span><span class="o">=</span><span class="n">_udtf_type</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)(</span>
</span><span id="unnest_to_explode-360"><a href="#unnest_to_explode-360"><span class="linenos">360</span></a> <span class="n">this</span><span class="o">=</span><span class="n">this</span><span class="p">,</span>
</span><span id="unnest_to_explode-361"><a href="#unnest_to_explode-361"><span class="linenos">361</span></a> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</span><span class="p">,</span>
</span><span id="unnest_to_explode-362"><a href="#unnest_to_explode-362"><span class="linenos">362</span></a> <span class="p">),</span>
</span><span id="unnest_to_explode-363"><a href="#unnest_to_explode-363"><span class="linenos">363</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="unnest_to_explode-364"><a href="#unnest_to_explode-364"><span class="linenos">364</span></a> <span class="p">)</span>
</span><span id="unnest_to_explode-365"><a href="#unnest_to_explode-365"><span class="linenos">365</span></a> <span class="p">)</span>
</span><span id="unnest_to_explode-366"><a href="#unnest_to_explode-366"><span class="linenos">366</span></a>
</span><span id="unnest_to_explode-367"><a href="#unnest_to_explode-367"><span class="linenos">367</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
</span><span id="unnest_to_explode-368"><a href="#unnest_to_explode-368"><span class="linenos">368</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">joins</span><span class="p">):</span>
</span><span id="unnest_to_explode-369"><a href="#unnest_to_explode-369"><span class="linenos">369</span></a> <span class="n">join_expr</span> <span class="o">=</span> <span class="n">join</span><span class="o">.</span><span class="n">this</span>
</span><span id="unnest_to_explode-370"><a href="#unnest_to_explode-370"><span class="linenos">370</span></a>
</span><span id="unnest_to_explode-371"><a href="#unnest_to_explode-371"><span class="linenos">371</span></a> <span class="n">is_lateral</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">join_expr</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">)</span>
</span><span id="unnest_to_explode-372"><a href="#unnest_to_explode-372"><span class="linenos">372</span></a>
</span><span id="unnest_to_explode-373"><a href="#unnest_to_explode-373"><span class="linenos">373</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">join_expr</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="n">is_lateral</span> <span class="k">else</span> <span class="n">join_expr</span>
</span><span id="unnest_to_explode-374"><a href="#unnest_to_explode-374"><span class="linenos">374</span></a>
</span><span id="unnest_to_explode-375"><a href="#unnest_to_explode-375"><span class="linenos">375</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
</span><span id="unnest_to_explode-376"><a href="#unnest_to_explode-376"><span class="linenos">376</span></a> <span class="k">if</span> <span class="n">is_lateral</span><span class="p">:</span>
</span><span id="unnest_to_explode-377"><a href="#unnest_to_explode-377"><span class="linenos">377</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">join_expr</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;alias&quot;</span><span class="p">)</span>
</span><span id="unnest_to_explode-378"><a href="#unnest_to_explode-378"><span class="linenos">378</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="unnest_to_explode-379"><a href="#unnest_to_explode-379"><span class="linenos">379</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">unnest</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;alias&quot;</span><span class="p">)</span>
</span><span id="unnest_to_explode-380"><a href="#unnest_to_explode-380"><span class="linenos">380</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">unnest</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="unnest_to_explode-381"><a href="#unnest_to_explode-381"><span class="linenos">381</span></a> <span class="c1"># The number of unnest.expressions will be changed by _unnest_zip_exprs, we need to record it here</span>
</span><span id="unnest_to_explode-382"><a href="#unnest_to_explode-382"><span class="linenos">382</span></a> <span class="n">has_multi_expr</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">exprs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span id="unnest_to_explode-383"><a href="#unnest_to_explode-383"><span class="linenos">383</span></a> <span class="n">exprs</span> <span class="o">=</span> <span class="n">_unnest_zip_exprs</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">exprs</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)</span>
</span><span id="unnest_to_explode-384"><a href="#unnest_to_explode-384"><span class="linenos">384</span></a>
</span><span id="unnest_to_explode-385"><a href="#unnest_to_explode-385"><span class="linenos">385</span></a> <span class="n">joins</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">join</span><span class="p">)</span>
</span><span id="unnest_to_explode-386"><a href="#unnest_to_explode-386"><span class="linenos">386</span></a>
</span><span id="unnest_to_explode-387"><a href="#unnest_to_explode-387"><span class="linenos">387</span></a> <span class="n">alias_cols</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">columns</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="unnest_to_explode-388"><a href="#unnest_to_explode-388"><span class="linenos">388</span></a>
</span><span id="unnest_to_explode-389"><a href="#unnest_to_explode-389"><span class="linenos">389</span></a> <span class="c1"># # Handle UNNEST to LATERAL VIEW EXPLODE: Exception is raised when there are 0 or &gt; 2 aliases</span>
</span><span id="unnest_to_explode-390"><a href="#unnest_to_explode-390"><span class="linenos">390</span></a> <span class="c1"># Spark LATERAL VIEW EXPLODE requires single alias for array/struct and two for Map type column unlike unnest in trino/presto which can take an arbitrary amount.</span>
</span><span id="unnest_to_explode-391"><a href="#unnest_to_explode-391"><span class="linenos">391</span></a> <span class="c1"># Refs: https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-lateral-view.html</span>
</span><span id="unnest_to_explode-392"><a href="#unnest_to_explode-392"><span class="linenos">392</span></a>
</span><span id="unnest_to_explode-393"><a href="#unnest_to_explode-393"><span class="linenos">393</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">has_multi_expr</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">alias_cols</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span>
</span><span id="unnest_to_explode-394"><a href="#unnest_to_explode-394"><span class="linenos">394</span></a> <span class="k">raise</span> <span class="n">UnsupportedError</span><span class="p">(</span>
</span><span id="unnest_to_explode-395"><a href="#unnest_to_explode-395"><span class="linenos">395</span></a> <span class="s2">&quot;CROSS JOIN UNNEST to LATERAL VIEW EXPLODE transformation requires explicit column aliases&quot;</span>
</span><span id="unnest_to_explode-396"><a href="#unnest_to_explode-396"><span class="linenos">396</span></a> <span class="p">)</span>
</span><span id="unnest_to_explode-397"><a href="#unnest_to_explode-397"><span class="linenos">397</span></a>
</span><span id="unnest_to_explode-398"><a href="#unnest_to_explode-398"><span class="linenos">398</span></a> <span class="k">for</span> <span class="n">e</span><span class="p">,</span> <span class="n">column</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">exprs</span><span class="p">,</span> <span class="n">alias_cols</span><span class="p">):</span>
</span><span id="unnest_to_explode-399"><a href="#unnest_to_explode-399"><span class="linenos">399</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="unnest_to_explode-400"><a href="#unnest_to_explode-400"><span class="linenos">400</span></a> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span>
</span><span id="unnest_to_explode-401"><a href="#unnest_to_explode-401"><span class="linenos">401</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">(</span>
</span><span id="unnest_to_explode-402"><a href="#unnest_to_explode-402"><span class="linenos">402</span></a> <span class="n">this</span><span class="o">=</span><span class="n">_udtf_type</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">has_multi_expr</span><span class="p">)(</span><span class="n">this</span><span class="o">=</span><span class="n">e</span><span class="p">),</span>
</span><span id="unnest_to_explode-403"><a href="#unnest_to_explode-403"><span class="linenos">403</span></a> <span class="n">view</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="unnest_to_explode-404"><a href="#unnest_to_explode-404"><span class="linenos">404</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
</span><span id="unnest_to_explode-405"><a href="#unnest_to_explode-405"><span class="linenos">405</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="c1"># type: ignore</span>
</span><span id="unnest_to_explode-406"><a href="#unnest_to_explode-406"><span class="linenos">406</span></a> <span class="n">columns</span><span class="o">=</span><span class="n">alias_cols</span><span class="p">,</span>
</span><span id="unnest_to_explode-407"><a href="#unnest_to_explode-407"><span class="linenos">407</span></a> <span class="p">),</span>
</span><span id="unnest_to_explode-408"><a href="#unnest_to_explode-408"><span class="linenos">408</span></a> <span class="p">),</span>
</span><span id="unnest_to_explode-409"><a href="#unnest_to_explode-409"><span class="linenos">409</span></a> <span class="p">)</span>
</span><span id="unnest_to_explode-410"><a href="#unnest_to_explode-410"><span class="linenos">410</span></a>
</span><span id="unnest_to_explode-411"><a href="#unnest_to_explode-411"><span class="linenos">411</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert cross join unnest into lateral view explode.</p>
</div>
</section>
<section id="explode_projection_to_unnest">
<input id="explode_projection_to_unnest-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">explode_projection_to_unnest</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">index_offset</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span></span><span class="return-annotation">) -> <span class="n">Callable</span><span class="p">[[</span><span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="explode_projection_to_unnest-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#explode_projection_to_unnest"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="explode_projection_to_unnest-414"><a href="#explode_projection_to_unnest-414"><span class="linenos">414</span></a><span class="k">def</span><span class="w"> </span><span class="nf">explode_projection_to_unnest</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-415"><a href="#explode_projection_to_unnest-415"><span class="linenos">415</span></a> <span class="n">index_offset</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-416"><a href="#explode_projection_to_unnest-416"><span class="linenos">416</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="explode_projection_to_unnest-417"><a href="#explode_projection_to_unnest-417"><span class="linenos">417</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert explode/posexplode projections into unnests.&quot;&quot;&quot;</span>
</span><span id="explode_projection_to_unnest-418"><a href="#explode_projection_to_unnest-418"><span class="linenos">418</span></a>
</span><span id="explode_projection_to_unnest-419"><a href="#explode_projection_to_unnest-419"><span class="linenos">419</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_explode_projection_to_unnest</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="explode_projection_to_unnest-420"><a href="#explode_projection_to_unnest-420"><span class="linenos">420</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-421"><a href="#explode_projection_to_unnest-421"><span class="linenos">421</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">Scope</span>
</span><span id="explode_projection_to_unnest-422"><a href="#explode_projection_to_unnest-422"><span class="linenos">422</span></a>
</span><span id="explode_projection_to_unnest-423"><a href="#explode_projection_to_unnest-423"><span class="linenos">423</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-424"><a href="#explode_projection_to_unnest-424"><span class="linenos">424</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="o">.</span><span class="n">references</span><span class="p">}</span>
</span><span id="explode_projection_to_unnest-425"><a href="#explode_projection_to_unnest-425"><span class="linenos">425</span></a>
</span><span id="explode_projection_to_unnest-426"><a href="#explode_projection_to_unnest-426"><span class="linenos">426</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">new_name</span><span class="p">(</span><span class="n">names</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-427"><a href="#explode_projection_to_unnest-427"><span class="linenos">427</span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-428"><a href="#explode_projection_to_unnest-428"><span class="linenos">428</span></a> <span class="n">names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-429"><a href="#explode_projection_to_unnest-429"><span class="linenos">429</span></a> <span class="k">return</span> <span class="n">name</span>
</span><span id="explode_projection_to_unnest-430"><a href="#explode_projection_to_unnest-430"><span class="linenos">430</span></a>
</span><span id="explode_projection_to_unnest-431"><a href="#explode_projection_to_unnest-431"><span class="linenos">431</span></a> <span class="n">arrays</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Condition</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="explode_projection_to_unnest-432"><a href="#explode_projection_to_unnest-432"><span class="linenos">432</span></a> <span class="n">series_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-433"><a href="#explode_projection_to_unnest-433"><span class="linenos">433</span></a> <span class="n">series</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-434"><a href="#explode_projection_to_unnest-434"><span class="linenos">434</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-435"><a href="#explode_projection_to_unnest-435"><span class="linenos">435</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">GenerateSeries</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">index_offset</span><span class="p">))]</span>
</span><span id="explode_projection_to_unnest-436"><a href="#explode_projection_to_unnest-436"><span class="linenos">436</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-437"><a href="#explode_projection_to_unnest-437"><span class="linenos">437</span></a> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">&quot;_u&quot;</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-438"><a href="#explode_projection_to_unnest-438"><span class="linenos">438</span></a> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">series_alias</span><span class="p">],</span>
</span><span id="explode_projection_to_unnest-439"><a href="#explode_projection_to_unnest-439"><span class="linenos">439</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-440"><a href="#explode_projection_to_unnest-440"><span class="linenos">440</span></a>
</span><span id="explode_projection_to_unnest-441"><a href="#explode_projection_to_unnest-441"><span class="linenos">441</span></a> <span class="c1"># we use list here because expression.selects is mutated inside the loop</span>
</span><span id="explode_projection_to_unnest-442"><a href="#explode_projection_to_unnest-442"><span class="linenos">442</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-443"><a href="#explode_projection_to_unnest-443"><span class="linenos">443</span></a> <span class="n">explode</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-444"><a href="#explode_projection_to_unnest-444"><span class="linenos">444</span></a>
</span><span id="explode_projection_to_unnest-445"><a href="#explode_projection_to_unnest-445"><span class="linenos">445</span></a> <span class="k">if</span> <span class="n">explode</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-446"><a href="#explode_projection_to_unnest-446"><span class="linenos">446</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="explode_projection_to_unnest-447"><a href="#explode_projection_to_unnest-447"><span class="linenos">447</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span id="explode_projection_to_unnest-448"><a href="#explode_projection_to_unnest-448"><span class="linenos">448</span></a>
</span><span id="explode_projection_to_unnest-449"><a href="#explode_projection_to_unnest-449"><span class="linenos">449</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-450"><a href="#explode_projection_to_unnest-450"><span class="linenos">450</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span>
</span><span id="explode_projection_to_unnest-451"><a href="#explode_projection_to_unnest-451"><span class="linenos">451</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</span>
</span><span id="explode_projection_to_unnest-452"><a href="#explode_projection_to_unnest-452"><span class="linenos">452</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Aliases</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-453"><a href="#explode_projection_to_unnest-453"><span class="linenos">453</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="explode_projection_to_unnest-454"><a href="#explode_projection_to_unnest-454"><span class="linenos">454</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span id="explode_projection_to_unnest-455"><a href="#explode_projection_to_unnest-455"><span class="linenos">455</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="explode_projection_to_unnest-456"><a href="#explode_projection_to_unnest-456"><span class="linenos">456</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-457"><a href="#explode_projection_to_unnest-457"><span class="linenos">457</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">select</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">alias_</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">))</span>
</span><span id="explode_projection_to_unnest-458"><a href="#explode_projection_to_unnest-458"><span class="linenos">458</span></a> <span class="n">explode</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-459"><a href="#explode_projection_to_unnest-459"><span class="linenos">459</span></a> <span class="k">assert</span> <span class="n">explode</span>
</span><span id="explode_projection_to_unnest-460"><a href="#explode_projection_to_unnest-460"><span class="linenos">460</span></a>
</span><span id="explode_projection_to_unnest-461"><a href="#explode_projection_to_unnest-461"><span class="linenos">461</span></a> <span class="n">is_posexplode</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-462"><a href="#explode_projection_to_unnest-462"><span class="linenos">462</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">explode</span><span class="o">.</span><span class="n">this</span>
</span><span id="explode_projection_to_unnest-463"><a href="#explode_projection_to_unnest-463"><span class="linenos">463</span></a>
</span><span id="explode_projection_to_unnest-464"><a href="#explode_projection_to_unnest-464"><span class="linenos">464</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ExplodeOuter</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-465"><a href="#explode_projection_to_unnest-465"><span class="linenos">465</span></a> <span class="n">bracket</span> <span class="o">=</span> <span class="n">explode_arg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="explode_projection_to_unnest-466"><a href="#explode_projection_to_unnest-466"><span class="linenos">466</span></a> <span class="n">bracket</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;safe&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-467"><a href="#explode_projection_to_unnest-467"><span class="linenos">467</span></a> <span class="n">bracket</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;offset&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-468"><a href="#explode_projection_to_unnest-468"><span class="linenos">468</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-469"><a href="#explode_projection_to_unnest-469"><span class="linenos">469</span></a> <span class="s2">&quot;IF&quot;</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-470"><a href="#explode_projection_to_unnest-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-471"><a href="#explode_projection_to_unnest-471"><span class="linenos">471</span></a> <span class="s2">&quot;ARRAY_SIZE&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;COALESCE&quot;</span><span class="p">,</span> <span class="n">explode_arg</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">())</span>
</span><span id="explode_projection_to_unnest-472"><a href="#explode_projection_to_unnest-472"><span class="linenos">472</span></a> <span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-473"><a href="#explode_projection_to_unnest-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">bracket</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-474"><a href="#explode_projection_to_unnest-474"><span class="linenos">474</span></a> <span class="n">explode_arg</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-475"><a href="#explode_projection_to_unnest-475"><span class="linenos">475</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-476"><a href="#explode_projection_to_unnest-476"><span class="linenos">476</span></a>
</span><span id="explode_projection_to_unnest-477"><a href="#explode_projection_to_unnest-477"><span class="linenos">477</span></a> <span class="c1"># This ensures that we won&#39;t use [POS]EXPLODE&#39;s argument as a new selection</span>
</span><span id="explode_projection_to_unnest-478"><a href="#explode_projection_to_unnest-478"><span class="linenos">478</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-479"><a href="#explode_projection_to_unnest-479"><span class="linenos">479</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-480"><a href="#explode_projection_to_unnest-480"><span class="linenos">480</span></a>
</span><span id="explode_projection_to_unnest-481"><a href="#explode_projection_to_unnest-481"><span class="linenos">481</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">&quot;_u&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-482"><a href="#explode_projection_to_unnest-482"><span class="linenos">482</span></a>
</span><span id="explode_projection_to_unnest-483"><a href="#explode_projection_to_unnest-483"><span class="linenos">483</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-484"><a href="#explode_projection_to_unnest-484"><span class="linenos">484</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;col&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-485"><a href="#explode_projection_to_unnest-485"><span class="linenos">485</span></a>
</span><span id="explode_projection_to_unnest-486"><a href="#explode_projection_to_unnest-486"><span class="linenos">486</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-487"><a href="#explode_projection_to_unnest-487"><span class="linenos">487</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-488"><a href="#explode_projection_to_unnest-488"><span class="linenos">488</span></a>
</span><span id="explode_projection_to_unnest-489"><a href="#explode_projection_to_unnest-489"><span class="linenos">489</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">pos_alias</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-490"><a href="#explode_projection_to_unnest-490"><span class="linenos">490</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">&quot;pos&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-491"><a href="#explode_projection_to_unnest-491"><span class="linenos">491</span></a>
</span><span id="explode_projection_to_unnest-492"><a href="#explode_projection_to_unnest-492"><span class="linenos">492</span></a> <span class="n">alias</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="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
</span><span id="explode_projection_to_unnest-493"><a href="#explode_projection_to_unnest-493"><span class="linenos">493</span></a>
</span><span id="explode_projection_to_unnest-494"><a href="#explode_projection_to_unnest-494"><span class="linenos">494</span></a> <span class="n">series_table_alias</span> <span class="o">=</span> <span class="n">series</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span>
</span><span id="explode_projection_to_unnest-495"><a href="#explode_projection_to_unnest-495"><span class="linenos">495</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">If</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-496"><a href="#explode_projection_to_unnest-496"><span class="linenos">496</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-497"><a href="#explode_projection_to_unnest-497"><span class="linenos">497</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-498"><a href="#explode_projection_to_unnest-498"><span class="linenos">498</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-499"><a href="#explode_projection_to_unnest-499"><span class="linenos">499</span></a> <span class="n">true</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-500"><a href="#explode_projection_to_unnest-500"><span class="linenos">500</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-501"><a href="#explode_projection_to_unnest-501"><span class="linenos">501</span></a>
</span><span id="explode_projection_to_unnest-502"><a href="#explode_projection_to_unnest-502"><span class="linenos">502</span></a> <span class="n">explode</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-503"><a href="#explode_projection_to_unnest-503"><span class="linenos">503</span></a>
</span><span id="explode_projection_to_unnest-504"><a href="#explode_projection_to_unnest-504"><span class="linenos">504</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-505"><a href="#explode_projection_to_unnest-505"><span class="linenos">505</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="explode_projection_to_unnest-506"><a href="#explode_projection_to_unnest-506"><span class="linenos">506</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-507"><a href="#explode_projection_to_unnest-507"><span class="linenos">507</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-508"><a href="#explode_projection_to_unnest-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">If</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-509"><a href="#explode_projection_to_unnest-509"><span class="linenos">509</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-510"><a href="#explode_projection_to_unnest-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-511"><a href="#explode_projection_to_unnest-511"><span class="linenos">511</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-512"><a href="#explode_projection_to_unnest-512"><span class="linenos">512</span></a> <span class="n">true</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-513"><a href="#explode_projection_to_unnest-513"><span class="linenos">513</span></a> <span class="p">)</span><span class="o">.</span><span class="n">as_</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-514"><a href="#explode_projection_to_unnest-514"><span class="linenos">514</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-515"><a href="#explode_projection_to_unnest-515"><span class="linenos">515</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">expressions</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-516"><a href="#explode_projection_to_unnest-516"><span class="linenos">516</span></a>
</span><span id="explode_projection_to_unnest-517"><a href="#explode_projection_to_unnest-517"><span class="linenos">517</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">arrays</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-518"><a href="#explode_projection_to_unnest-518"><span class="linenos">518</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">):</span>
</span><span id="explode_projection_to_unnest-519"><a href="#explode_projection_to_unnest-519"><span class="linenos">519</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-520"><a href="#explode_projection_to_unnest-520"><span class="linenos">520</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-521"><a href="#explode_projection_to_unnest-521"><span class="linenos">521</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">series</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-522"><a href="#explode_projection_to_unnest-522"><span class="linenos">522</span></a>
</span><span id="explode_projection_to_unnest-523"><a href="#explode_projection_to_unnest-523"><span class="linenos">523</span></a> <span class="n">size</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Condition</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="explode_projection_to_unnest-524"><a href="#explode_projection_to_unnest-524"><span class="linenos">524</span></a> <span class="n">arrays</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-525"><a href="#explode_projection_to_unnest-525"><span class="linenos">525</span></a>
</span><span id="explode_projection_to_unnest-526"><a href="#explode_projection_to_unnest-526"><span class="linenos">526</span></a> <span class="c1"># trino doesn&#39;t support left join unnest with on conditions</span>
</span><span id="explode_projection_to_unnest-527"><a href="#explode_projection_to_unnest-527"><span class="linenos">527</span></a> <span class="c1"># if it did, this would be much simpler</span>
</span><span id="explode_projection_to_unnest-528"><a href="#explode_projection_to_unnest-528"><span class="linenos">528</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-529"><a href="#explode_projection_to_unnest-529"><span class="linenos">529</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-530"><a href="#explode_projection_to_unnest-530"><span class="linenos">530</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-531"><a href="#explode_projection_to_unnest-531"><span class="linenos">531</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span>
</span><span id="explode_projection_to_unnest-532"><a href="#explode_projection_to_unnest-532"><span class="linenos">532</span></a> <span class="n">offset</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">),</span>
</span><span id="explode_projection_to_unnest-533"><a href="#explode_projection_to_unnest-533"><span class="linenos">533</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-534"><a href="#explode_projection_to_unnest-534"><span class="linenos">534</span></a> <span class="n">unnest_source_alias</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-535"><a href="#explode_projection_to_unnest-535"><span class="linenos">535</span></a> <span class="n">table</span><span class="o">=</span><span class="p">[</span><span class="n">explode_alias</span><span class="p">],</span>
</span><span id="explode_projection_to_unnest-536"><a href="#explode_projection_to_unnest-536"><span class="linenos">536</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-537"><a href="#explode_projection_to_unnest-537"><span class="linenos">537</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">&quot;CROSS&quot;</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-538"><a href="#explode_projection_to_unnest-538"><span class="linenos">538</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-539"><a href="#explode_projection_to_unnest-539"><span class="linenos">539</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-540"><a href="#explode_projection_to_unnest-540"><span class="linenos">540</span></a>
</span><span id="explode_projection_to_unnest-541"><a href="#explode_projection_to_unnest-541"><span class="linenos">541</span></a> <span class="k">if</span> <span class="n">index_offset</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-542"><a href="#explode_projection_to_unnest-542"><span class="linenos">542</span></a> <span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span>
</span><span id="explode_projection_to_unnest-543"><a href="#explode_projection_to_unnest-543"><span class="linenos">543</span></a>
</span><span id="explode_projection_to_unnest-544"><a href="#explode_projection_to_unnest-544"><span class="linenos">544</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-545"><a href="#explode_projection_to_unnest-545"><span class="linenos">545</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-546"><a href="#explode_projection_to_unnest-546"><span class="linenos">546</span></a> <span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">))</span>
</span><span id="explode_projection_to_unnest-547"><a href="#explode_projection_to_unnest-547"><span class="linenos">547</span></a> <span class="o">.</span><span class="n">or_</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-548"><a href="#explode_projection_to_unnest-548"><span class="linenos">548</span></a> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">series_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">series_table_alias</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">size</span><span class="p">)</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span>
</span><span id="explode_projection_to_unnest-549"><a href="#explode_projection_to_unnest-549"><span class="linenos">549</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">unnest_source_alias</span><span class="p">)</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-550"><a href="#explode_projection_to_unnest-550"><span class="linenos">550</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-551"><a href="#explode_projection_to_unnest-551"><span class="linenos">551</span></a> <span class="p">),</span>
</span><span id="explode_projection_to_unnest-552"><a href="#explode_projection_to_unnest-552"><span class="linenos">552</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="explode_projection_to_unnest-553"><a href="#explode_projection_to_unnest-553"><span class="linenos">553</span></a> <span class="p">)</span>
</span><span id="explode_projection_to_unnest-554"><a href="#explode_projection_to_unnest-554"><span class="linenos">554</span></a>
</span><span id="explode_projection_to_unnest-555"><a href="#explode_projection_to_unnest-555"><span class="linenos">555</span></a> <span class="k">if</span> <span class="n">arrays</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-556"><a href="#explode_projection_to_unnest-556"><span class="linenos">556</span></a> <span class="n">end</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Condition</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Greatest</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">arrays</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">expressions</span><span class="o">=</span><span class="n">arrays</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
</span><span id="explode_projection_to_unnest-557"><a href="#explode_projection_to_unnest-557"><span class="linenos">557</span></a>
</span><span id="explode_projection_to_unnest-558"><a href="#explode_projection_to_unnest-558"><span class="linenos">558</span></a> <span class="k">if</span> <span class="n">index_offset</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="explode_projection_to_unnest-559"><a href="#explode_projection_to_unnest-559"><span class="linenos">559</span></a> <span class="n">end</span> <span class="o">=</span> <span class="n">end</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">index_offset</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-560"><a href="#explode_projection_to_unnest-560"><span class="linenos">560</span></a> <span class="n">series</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;end&quot;</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
</span><span id="explode_projection_to_unnest-561"><a href="#explode_projection_to_unnest-561"><span class="linenos">561</span></a>
</span><span id="explode_projection_to_unnest-562"><a href="#explode_projection_to_unnest-562"><span class="linenos">562</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="explode_projection_to_unnest-563"><a href="#explode_projection_to_unnest-563"><span class="linenos">563</span></a>
</span><span id="explode_projection_to_unnest-564"><a href="#explode_projection_to_unnest-564"><span class="linenos">564</span></a> <span class="k">return</span> <span class="n">_explode_projection_to_unnest</span>
</span></pre></div>
<div class="docstring"><p>Convert explode/posexplode projections into unnests.</p>
</div>
</section>
<section id="add_within_group_for_percentiles">
<input id="add_within_group_for_percentiles-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">add_within_group_for_percentiles</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="add_within_group_for_percentiles-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#add_within_group_for_percentiles"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="add_within_group_for_percentiles-567"><a href="#add_within_group_for_percentiles-567"><span class="linenos">567</span></a><span class="k">def</span><span class="w"> </span><span class="nf">add_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="add_within_group_for_percentiles-568"><a href="#add_within_group_for_percentiles-568"><span class="linenos">568</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Transforms percentiles by adding a WITHIN GROUP clause to them.&quot;&quot;&quot;</span>
</span><span id="add_within_group_for_percentiles-569"><a href="#add_within_group_for_percentiles-569"><span class="linenos">569</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="add_within_group_for_percentiles-570"><a href="#add_within_group_for_percentiles-570"><span class="linenos">570</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PERCENTILES</span><span class="p">)</span>
</span><span id="add_within_group_for_percentiles-571"><a href="#add_within_group_for_percentiles-571"><span class="linenos">571</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
</span><span id="add_within_group_for_percentiles-572"><a href="#add_within_group_for_percentiles-572"><span class="linenos">572</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span>
</span><span id="add_within_group_for_percentiles-573"><a href="#add_within_group_for_percentiles-573"><span class="linenos">573</span></a> <span class="p">):</span>
</span><span id="add_within_group_for_percentiles-574"><a href="#add_within_group_for_percentiles-574"><span class="linenos">574</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="add_within_group_for_percentiles-575"><a href="#add_within_group_for_percentiles-575"><span class="linenos">575</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
</span><span id="add_within_group_for_percentiles-576"><a href="#add_within_group_for_percentiles-576"><span class="linenos">576</span></a> <span class="n">order</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)])</span>
</span><span id="add_within_group_for_percentiles-577"><a href="#add_within_group_for_percentiles-577"><span class="linenos">577</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">order</span><span class="p">)</span>
</span><span id="add_within_group_for_percentiles-578"><a href="#add_within_group_for_percentiles-578"><span class="linenos">578</span></a>
</span><span id="add_within_group_for_percentiles-579"><a href="#add_within_group_for_percentiles-579"><span class="linenos">579</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Transforms percentiles by adding a WITHIN GROUP clause to them.</p>
</div>
</section>
<section id="remove_within_group_for_percentiles">
<input id="remove_within_group_for_percentiles-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">remove_within_group_for_percentiles</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="remove_within_group_for_percentiles-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#remove_within_group_for_percentiles"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_within_group_for_percentiles-582"><a href="#remove_within_group_for_percentiles-582"><span class="linenos">582</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="remove_within_group_for_percentiles-583"><a href="#remove_within_group_for_percentiles-583"><span class="linenos">583</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause.&quot;&quot;&quot;</span>
</span><span id="remove_within_group_for_percentiles-584"><a href="#remove_within_group_for_percentiles-584"><span class="linenos">584</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="remove_within_group_for_percentiles-585"><a href="#remove_within_group_for_percentiles-585"><span class="linenos">585</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
</span><span id="remove_within_group_for_percentiles-586"><a href="#remove_within_group_for_percentiles-586"><span class="linenos">586</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PERCENTILES</span><span class="p">)</span>
</span><span id="remove_within_group_for_percentiles-587"><a href="#remove_within_group_for_percentiles-587"><span class="linenos">587</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">)</span>
</span><span id="remove_within_group_for_percentiles-588"><a href="#remove_within_group_for_percentiles-588"><span class="linenos">588</span></a> <span class="p">):</span>
</span><span id="remove_within_group_for_percentiles-589"><a href="#remove_within_group_for_percentiles-589"><span class="linenos">589</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="remove_within_group_for_percentiles-590"><a href="#remove_within_group_for_percentiles-590"><span class="linenos">590</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
</span><span id="remove_within_group_for_percentiles-591"><a href="#remove_within_group_for_percentiles-591"><span class="linenos">591</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
</span><span id="remove_within_group_for_percentiles-592"><a href="#remove_within_group_for_percentiles-592"><span class="linenos">592</span></a>
</span><span id="remove_within_group_for_percentiles-593"><a href="#remove_within_group_for_percentiles-593"><span class="linenos">593</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause.</p>
</div>
</section>
<section id="add_recursive_cte_column_names">
<input id="add_recursive_cte_column_names-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">add_recursive_cte_column_names</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="add_recursive_cte_column_names-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#add_recursive_cte_column_names"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="add_recursive_cte_column_names-596"><a href="#add_recursive_cte_column_names-596"><span class="linenos">596</span></a><span class="k">def</span><span class="w"> </span><span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="add_recursive_cte_column_names-597"><a href="#add_recursive_cte_column_names-597"><span class="linenos">597</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Uses projection output names in recursive CTE definitions to define the CTEs&#39; columns.&quot;&quot;&quot;</span>
</span><span id="add_recursive_cte_column_names-598"><a href="#add_recursive_cte_column_names-598"><span class="linenos">598</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="add_recursive_cte_column_names-599"><a href="#add_recursive_cte_column_names-599"><span class="linenos">599</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">&quot;_c_&quot;</span><span class="p">)</span>
</span><span id="add_recursive_cte_column_names-600"><a href="#add_recursive_cte_column_names-600"><span class="linenos">600</span></a>
</span><span id="add_recursive_cte_column_names-601"><a href="#add_recursive_cte_column_names-601"><span class="linenos">601</span></a> <span class="k">for</span> <span class="n">cte</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="add_recursive_cte_column_names-602"><a href="#add_recursive_cte_column_names-602"><span class="linenos">602</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
</span><span id="add_recursive_cte_column_names-603"><a href="#add_recursive_cte_column_names-603"><span class="linenos">603</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
</span><span id="add_recursive_cte_column_names-604"><a href="#add_recursive_cte_column_names-604"><span class="linenos">604</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">SetOperation</span><span class="p">):</span>
</span><span id="add_recursive_cte_column_names-605"><a href="#add_recursive_cte_column_names-605"><span class="linenos">605</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">this</span>
</span><span id="add_recursive_cte_column_names-606"><a href="#add_recursive_cte_column_names-606"><span class="linenos">606</span></a>
</span><span id="add_recursive_cte_column_names-607"><a href="#add_recursive_cte_column_names-607"><span class="linenos">607</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;alias&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="add_recursive_cte_column_names-608"><a href="#add_recursive_cte_column_names-608"><span class="linenos">608</span></a> <span class="s2">&quot;columns&quot;</span><span class="p">,</span>
</span><span id="add_recursive_cte_column_names-609"><a href="#add_recursive_cte_column_names-609"><span class="linenos">609</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
</span><span id="add_recursive_cte_column_names-610"><a href="#add_recursive_cte_column_names-610"><span class="linenos">610</span></a> <span class="p">)</span>
</span><span id="add_recursive_cte_column_names-611"><a href="#add_recursive_cte_column_names-611"><span class="linenos">611</span></a>
</span><span id="add_recursive_cte_column_names-612"><a href="#add_recursive_cte_column_names-612"><span class="linenos">612</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Uses projection output names in recursive CTE definitions to define the CTEs' columns.</p>
</div>
</section>
<section id="epoch_cast_to_ts">
<input id="epoch_cast_to_ts-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">epoch_cast_to_ts</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="epoch_cast_to_ts-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#epoch_cast_to_ts"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="epoch_cast_to_ts-615"><a href="#epoch_cast_to_ts-615"><span class="linenos">615</span></a><span class="k">def</span><span class="w"> </span><span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="epoch_cast_to_ts-616"><a href="#epoch_cast_to_ts-616"><span class="linenos">616</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Replace &#39;epoch&#39; in casts by the equivalent date literal.&quot;&quot;&quot;</span>
</span><span id="epoch_cast_to_ts-617"><a href="#epoch_cast_to_ts-617"><span class="linenos">617</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="epoch_cast_to_ts-618"><a href="#epoch_cast_to_ts-618"><span class="linenos">618</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
</span><span id="epoch_cast_to_ts-619"><a href="#epoch_cast_to_ts-619"><span class="linenos">619</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;epoch&quot;</span>
</span><span id="epoch_cast_to_ts-620"><a href="#epoch_cast_to_ts-620"><span class="linenos">620</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
</span><span id="epoch_cast_to_ts-621"><a href="#epoch_cast_to_ts-621"><span class="linenos">621</span></a> <span class="p">):</span>
</span><span id="epoch_cast_to_ts-622"><a href="#epoch_cast_to_ts-622"><span class="linenos">622</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;1970-01-01 00:00:00&quot;</span><span class="p">))</span>
</span><span id="epoch_cast_to_ts-623"><a href="#epoch_cast_to_ts-623"><span class="linenos">623</span></a>
</span><span id="epoch_cast_to_ts-624"><a href="#epoch_cast_to_ts-624"><span class="linenos">624</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Replace 'epoch' in casts by the equivalent date literal.</p>
</div>
</section>
<section id="eliminate_semi_and_anti_joins">
<input id="eliminate_semi_and_anti_joins-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_semi_and_anti_joins</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_semi_and_anti_joins-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_semi_and_anti_joins"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_semi_and_anti_joins-627"><a href="#eliminate_semi_and_anti_joins-627"><span class="linenos">627</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_semi_and_anti_joins</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_semi_and_anti_joins-628"><a href="#eliminate_semi_and_anti_joins-628"><span class="linenos">628</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Convert SEMI and ANTI joins into equivalent forms that use EXIST instead.&quot;&quot;&quot;</span>
</span><span id="eliminate_semi_and_anti_joins-629"><a href="#eliminate_semi_and_anti_joins-629"><span class="linenos">629</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="eliminate_semi_and_anti_joins-630"><a href="#eliminate_semi_and_anti_joins-630"><span class="linenos">630</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
</span><span id="eliminate_semi_and_anti_joins-631"><a href="#eliminate_semi_and_anti_joins-631"><span class="linenos">631</span></a> <span class="n">on</span> <span class="o">=</span> <span class="n">join</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;on&quot;</span><span class="p">)</span>
</span><span id="eliminate_semi_and_anti_joins-632"><a href="#eliminate_semi_and_anti_joins-632"><span class="linenos">632</span></a> <span class="k">if</span> <span class="n">on</span> <span class="ow">and</span> <span class="n">join</span><span class="o">.</span><span class="n">kind</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;SEMI&quot;</span><span class="p">,</span> <span class="s2">&quot;ANTI&quot;</span><span class="p">):</span>
</span><span id="eliminate_semi_and_anti_joins-633"><a href="#eliminate_semi_and_anti_joins-633"><span class="linenos">633</span></a> <span class="n">subquery</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">on</span><span class="p">)</span>
</span><span id="eliminate_semi_and_anti_joins-634"><a href="#eliminate_semi_and_anti_joins-634"><span class="linenos">634</span></a> <span class="n">exists</span> <span class="o">=</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">subquery</span><span class="p">)</span>
</span><span id="eliminate_semi_and_anti_joins-635"><a href="#eliminate_semi_and_anti_joins-635"><span class="linenos">635</span></a> <span class="k">if</span> <span class="n">join</span><span class="o">.</span><span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;ANTI&quot;</span><span class="p">:</span>
</span><span id="eliminate_semi_and_anti_joins-636"><a href="#eliminate_semi_and_anti_joins-636"><span class="linenos">636</span></a> <span class="n">exists</span> <span class="o">=</span> <span class="n">exists</span><span class="o">.</span><span class="n">not_</span><span class="p">(</span><span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_semi_and_anti_joins-637"><a href="#eliminate_semi_and_anti_joins-637"><span class="linenos">637</span></a>
</span><span id="eliminate_semi_and_anti_joins-638"><a href="#eliminate_semi_and_anti_joins-638"><span class="linenos">638</span></a> <span class="n">join</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_semi_and_anti_joins-639"><a href="#eliminate_semi_and_anti_joins-639"><span class="linenos">639</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exists</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_semi_and_anti_joins-640"><a href="#eliminate_semi_and_anti_joins-640"><span class="linenos">640</span></a>
</span><span id="eliminate_semi_and_anti_joins-641"><a href="#eliminate_semi_and_anti_joins-641"><span class="linenos">641</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert SEMI and ANTI joins into equivalent forms that use EXIST instead.</p>
</div>
</section>
<section id="eliminate_full_outer_join">
<input id="eliminate_full_outer_join-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_full_outer_join</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_full_outer_join-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_full_outer_join"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_full_outer_join-644"><a href="#eliminate_full_outer_join-644"><span class="linenos">644</span></a><span class="k">def</span><span class="w"> </span><span class="nf">eliminate_full_outer_join</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_full_outer_join-645"><a href="#eliminate_full_outer_join-645"><span class="linenos">645</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_full_outer_join-646"><a href="#eliminate_full_outer_join-646"><span class="linenos">646</span></a><span class="sd"> Converts a query with a FULL OUTER join to a union of identical queries that</span>
</span><span id="eliminate_full_outer_join-647"><a href="#eliminate_full_outer_join-647"><span class="linenos">647</span></a><span class="sd"> use LEFT/RIGHT OUTER joins instead. This transformation currently only works</span>
</span><span id="eliminate_full_outer_join-648"><a href="#eliminate_full_outer_join-648"><span class="linenos">648</span></a><span class="sd"> for queries that have a single FULL OUTER join.</span>
</span><span id="eliminate_full_outer_join-649"><a href="#eliminate_full_outer_join-649"><span class="linenos">649</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_full_outer_join-650"><a href="#eliminate_full_outer_join-650"><span class="linenos">650</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="eliminate_full_outer_join-651"><a href="#eliminate_full_outer_join-651"><span class="linenos">651</span></a> <span class="n">full_outer_joins</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="eliminate_full_outer_join-652"><a href="#eliminate_full_outer_join-652"><span class="linenos">652</span></a> <span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">join</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-653"><a href="#eliminate_full_outer_join-653"><span class="linenos">653</span></a> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">join</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
</span><span id="eliminate_full_outer_join-654"><a href="#eliminate_full_outer_join-654"><span class="linenos">654</span></a> <span class="k">if</span> <span class="n">join</span><span class="o">.</span><span class="n">side</span> <span class="o">==</span> <span class="s2">&quot;FULL&quot;</span>
</span><span id="eliminate_full_outer_join-655"><a href="#eliminate_full_outer_join-655"><span class="linenos">655</span></a> <span class="p">]</span>
</span><span id="eliminate_full_outer_join-656"><a href="#eliminate_full_outer_join-656"><span class="linenos">656</span></a>
</span><span id="eliminate_full_outer_join-657"><a href="#eliminate_full_outer_join-657"><span class="linenos">657</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">full_outer_joins</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="eliminate_full_outer_join-658"><a href="#eliminate_full_outer_join-658"><span class="linenos">658</span></a> <span class="n">expression_copy</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="eliminate_full_outer_join-659"><a href="#eliminate_full_outer_join-659"><span class="linenos">659</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;limit&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-660"><a href="#eliminate_full_outer_join-660"><span class="linenos">660</span></a> <span class="n">index</span><span class="p">,</span> <span class="n">full_outer_join</span> <span class="o">=</span> <span class="n">full_outer_joins</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="eliminate_full_outer_join-661"><a href="#eliminate_full_outer_join-661"><span class="linenos">661</span></a>
</span><span id="eliminate_full_outer_join-662"><a href="#eliminate_full_outer_join-662"><span class="linenos">662</span></a> <span class="n">tables</span> <span class="o">=</span> <span class="p">(</span><span class="n">expression</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">alias_or_name</span><span class="p">,</span> <span class="n">full_outer_join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-663"><a href="#eliminate_full_outer_join-663"><span class="linenos">663</span></a> <span class="n">join_conditions</span> <span class="o">=</span> <span class="n">full_outer_join</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;on&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span>
</span><span id="eliminate_full_outer_join-664"><a href="#eliminate_full_outer_join-664"><span class="linenos">664</span></a> <span class="o">*</span><span class="p">[</span>
</span><span id="eliminate_full_outer_join-665"><a href="#eliminate_full_outer_join-665"><span class="linenos">665</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="n">tables</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span><span id="eliminate_full_outer_join-666"><a href="#eliminate_full_outer_join-666"><span class="linenos">666</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">full_outer_join</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;using&quot;</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-667"><a href="#eliminate_full_outer_join-667"><span class="linenos">667</span></a> <span class="p">]</span>
</span><span id="eliminate_full_outer_join-668"><a href="#eliminate_full_outer_join-668"><span class="linenos">668</span></a> <span class="p">)</span>
</span><span id="eliminate_full_outer_join-669"><a href="#eliminate_full_outer_join-669"><span class="linenos">669</span></a>
</span><span id="eliminate_full_outer_join-670"><a href="#eliminate_full_outer_join-670"><span class="linenos">670</span></a> <span class="n">full_outer_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="s2">&quot;left&quot;</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-671"><a href="#eliminate_full_outer_join-671"><span class="linenos">671</span></a> <span class="n">anti_join_clause</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;1&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</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">where</span><span class="p">(</span><span class="n">join_conditions</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-672"><a href="#eliminate_full_outer_join-672"><span class="linenos">672</span></a> <span class="n">expression_copy</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;joins&quot;</span><span class="p">][</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="s2">&quot;right&quot;</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-673"><a href="#eliminate_full_outer_join-673"><span class="linenos">673</span></a> <span class="n">expression_copy</span> <span class="o">=</span> <span class="n">expression_copy</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">anti_join_clause</span><span class="p">)</span><span class="o">.</span><span class="n">not_</span><span class="p">())</span>
</span><span id="eliminate_full_outer_join-674"><a href="#eliminate_full_outer_join-674"><span class="linenos">674</span></a> <span class="n">expression_copy</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="c1"># remove CTEs from RIGHT side</span>
</span><span id="eliminate_full_outer_join-675"><a href="#eliminate_full_outer_join-675"><span class="linenos">675</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="c1"># remove order by from LEFT side</span>
</span><span id="eliminate_full_outer_join-676"><a href="#eliminate_full_outer_join-676"><span class="linenos">676</span></a>
</span><span id="eliminate_full_outer_join-677"><a href="#eliminate_full_outer_join-677"><span class="linenos">677</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_copy</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="eliminate_full_outer_join-678"><a href="#eliminate_full_outer_join-678"><span class="linenos">678</span></a>
</span><span id="eliminate_full_outer_join-679"><a href="#eliminate_full_outer_join-679"><span class="linenos">679</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Converts a query with a FULL OUTER join to a union of identical queries that
use LEFT/RIGHT OUTER joins instead. This transformation currently only works
for queries that have a single FULL OUTER join.</p>
</div>
</section>
<section id="move_ctes_to_top_level">
<input id="move_ctes_to_top_level-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">move_ctes_to_top_level</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">expression</span><span class="p">:</span> <span class="o">~</span><span class="n">E</span></span><span class="return-annotation">) -> <span class="o">~</span><span class="n">E</span>:</span></span>
<label class="view-source-button" for="move_ctes_to_top_level-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#move_ctes_to_top_level"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="move_ctes_to_top_level-682"><a href="#move_ctes_to_top_level-682"><span class="linenos">682</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_ctes_to_top_level</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">E</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">E</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-683"><a href="#move_ctes_to_top_level-683"><span class="linenos">683</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="move_ctes_to_top_level-684"><a href="#move_ctes_to_top_level-684"><span class="linenos">684</span></a><span class="sd"> Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be</span>
</span><span id="move_ctes_to_top_level-685"><a href="#move_ctes_to_top_level-685"><span class="linenos">685</span></a><span class="sd"> defined at the top-level, so for example queries like:</span>
</span><span id="move_ctes_to_top_level-686"><a href="#move_ctes_to_top_level-686"><span class="linenos">686</span></a>
</span><span id="move_ctes_to_top_level-687"><a href="#move_ctes_to_top_level-687"><span class="linenos">687</span></a><span class="sd"> SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq</span>
</span><span id="move_ctes_to_top_level-688"><a href="#move_ctes_to_top_level-688"><span class="linenos">688</span></a>
</span><span id="move_ctes_to_top_level-689"><a href="#move_ctes_to_top_level-689"><span class="linenos">689</span></a><span class="sd"> are invalid in those dialects. This transformation can be used to ensure all CTEs are</span>
</span><span id="move_ctes_to_top_level-690"><a href="#move_ctes_to_top_level-690"><span class="linenos">690</span></a><span class="sd"> moved to the top level so that the final SQL code is valid from a syntax standpoint.</span>
</span><span id="move_ctes_to_top_level-691"><a href="#move_ctes_to_top_level-691"><span class="linenos">691</span></a>
</span><span id="move_ctes_to_top_level-692"><a href="#move_ctes_to_top_level-692"><span class="linenos">692</span></a><span class="sd"> TODO: handle name clashes whilst moving CTEs (it can get quite tricky &amp; costly).</span>
</span><span id="move_ctes_to_top_level-693"><a href="#move_ctes_to_top_level-693"><span class="linenos">693</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="move_ctes_to_top_level-694"><a href="#move_ctes_to_top_level-694"><span class="linenos">694</span></a> <span class="n">top_level_with</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-695"><a href="#move_ctes_to_top_level-695"><span class="linenos">695</span></a> <span class="k">for</span> <span class="n">inner_with</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">With</span><span class="p">):</span>
</span><span id="move_ctes_to_top_level-696"><a href="#move_ctes_to_top_level-696"><span class="linenos">696</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-697"><a href="#move_ctes_to_top_level-697"><span class="linenos">697</span></a> <span class="k">continue</span>
</span><span id="move_ctes_to_top_level-698"><a href="#move_ctes_to_top_level-698"><span class="linenos">698</span></a>
</span><span id="move_ctes_to_top_level-699"><a href="#move_ctes_to_top_level-699"><span class="linenos">699</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">top_level_with</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-700"><a href="#move_ctes_to_top_level-700"><span class="linenos">700</span></a> <span class="n">top_level_with</span> <span class="o">=</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="move_ctes_to_top_level-701"><a href="#move_ctes_to_top_level-701"><span class="linenos">701</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-702"><a href="#move_ctes_to_top_level-702"><span class="linenos">702</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-703"><a href="#move_ctes_to_top_level-703"><span class="linenos">703</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-704"><a href="#move_ctes_to_top_level-704"><span class="linenos">704</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-705"><a href="#move_ctes_to_top_level-705"><span class="linenos">705</span></a>
</span><span id="move_ctes_to_top_level-706"><a href="#move_ctes_to_top_level-706"><span class="linenos">706</span></a> <span class="n">parent_cte</span> <span class="o">=</span> <span class="n">inner_with</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">CTE</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-707"><a href="#move_ctes_to_top_level-707"><span class="linenos">707</span></a> <span class="n">inner_with</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="move_ctes_to_top_level-708"><a href="#move_ctes_to_top_level-708"><span class="linenos">708</span></a>
</span><span id="move_ctes_to_top_level-709"><a href="#move_ctes_to_top_level-709"><span class="linenos">709</span></a> <span class="k">if</span> <span class="n">parent_cte</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-710"><a href="#move_ctes_to_top_level-710"><span class="linenos">710</span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">parent_cte</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-711"><a href="#move_ctes_to_top_level-711"><span class="linenos">711</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="move_ctes_to_top_level-712"><a href="#move_ctes_to_top_level-712"><span class="linenos">712</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-713"><a href="#move_ctes_to_top_level-713"><span class="linenos">713</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-714"><a href="#move_ctes_to_top_level-714"><span class="linenos">714</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="move_ctes_to_top_level-715"><a href="#move_ctes_to_top_level-715"><span class="linenos">715</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span> <span class="o">+</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="move_ctes_to_top_level-716"><a href="#move_ctes_to_top_level-716"><span class="linenos">716</span></a> <span class="p">)</span>
</span><span id="move_ctes_to_top_level-717"><a href="#move_ctes_to_top_level-717"><span class="linenos">717</span></a>
</span><span id="move_ctes_to_top_level-718"><a href="#move_ctes_to_top_level-718"><span class="linenos">718</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be
defined at the top-level, so for example queries like:</p>
<pre><code>SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq
</code></pre>
<p>are invalid in those dialects. This transformation can be used to ensure all CTEs are
moved to the top level so that the final SQL code is valid from a syntax standpoint.</p>
<p>TODO: handle name clashes whilst moving CTEs (it can get quite tricky &amp; costly).</p>
</div>
</section>
<section id="ensure_bools">
<input id="ensure_bools-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">ensure_bools</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="ensure_bools-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ensure_bools"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ensure_bools-721"><a href="#ensure_bools-721"><span class="linenos">721</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_bools</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="ensure_bools-722"><a href="#ensure_bools-722"><span class="linenos">722</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts numeric values used in conditions into explicit boolean expressions.&quot;&quot;&quot;</span>
</span><span id="ensure_bools-723"><a href="#ensure_bools-723"><span class="linenos">723</span></a> <span class="kn">from</span><span class="w"> </span><span class="nn">sqlglot.optimizer.canonicalize</span><span class="w"> </span><span class="kn">import</span> <span class="n">ensure_bools</span>
</span><span id="ensure_bools-724"><a href="#ensure_bools-724"><span class="linenos">724</span></a>
</span><span id="ensure_bools-725"><a href="#ensure_bools-725"><span class="linenos">725</span></a> <span class="k">def</span><span class="w"> </span><span class="nf">_ensure_bool</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ensure_bools-726"><a href="#ensure_bools-726"><span class="linenos">726</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="ensure_bools-727"><a href="#ensure_bools-727"><span class="linenos">727</span></a> <span class="n">node</span><span class="o">.</span><span class="n">is_number</span>
</span><span id="ensure_bools-728"><a href="#ensure_bools-728"><span class="linenos">728</span></a> <span class="ow">or</span> <span class="p">(</span>
</span><span id="ensure_bools-729"><a href="#ensure_bools-729"><span class="linenos">729</span></a> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">SubqueryPredicate</span><span class="p">)</span>
</span><span id="ensure_bools-730"><a href="#ensure_bools-730"><span class="linenos">730</span></a> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">UNKNOWN</span><span class="p">,</span> <span class="o">*</span><span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">NUMERIC_TYPES</span><span class="p">)</span>
</span><span id="ensure_bools-731"><a href="#ensure_bools-731"><span class="linenos">731</span></a> <span class="p">)</span>
</span><span id="ensure_bools-732"><a href="#ensure_bools-732"><span class="linenos">732</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
</span><span id="ensure_bools-733"><a href="#ensure_bools-733"><span class="linenos">733</span></a> <span class="p">):</span>
</span><span id="ensure_bools-734"><a href="#ensure_bools-734"><span class="linenos">734</span></a> <span class="n">node</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">neq</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
</span><span id="ensure_bools-735"><a href="#ensure_bools-735"><span class="linenos">735</span></a>
</span><span id="ensure_bools-736"><a href="#ensure_bools-736"><span class="linenos">736</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="ensure_bools-737"><a href="#ensure_bools-737"><span class="linenos">737</span></a> <span class="n">ensure_bools</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">_ensure_bool</span><span class="p">)</span>
</span><span id="ensure_bools-738"><a href="#ensure_bools-738"><span class="linenos">738</span></a>
</span><span id="ensure_bools-739"><a href="#ensure_bools-739"><span class="linenos">739</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Converts numeric values used in conditions into explicit boolean expressions.</p>
</div>
</section>
<section id="unqualify_columns">
<input id="unqualify_columns-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">unqualify_columns</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="unqualify_columns-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#unqualify_columns"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unqualify_columns-742"><a href="#unqualify_columns-742"><span class="linenos">742</span></a><span class="k">def</span><span class="w"> </span><span class="nf">unqualify_columns</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="unqualify_columns-743"><a href="#unqualify_columns-743"><span class="linenos">743</span></a> <span class="k">for</span> <span class="n">column</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">Column</span><span class="p">):</span>
</span><span id="unqualify_columns-744"><a href="#unqualify_columns-744"><span class="linenos">744</span></a> <span class="c1"># We only wanna pop off the table, db, catalog args</span>
</span><span id="unqualify_columns-745"><a href="#unqualify_columns-745"><span class="linenos">745</span></a> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">column</span><span class="o">.</span><span class="n">parts</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
</span><span id="unqualify_columns-746"><a href="#unqualify_columns-746"><span class="linenos">746</span></a> <span class="n">part</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="unqualify_columns-747"><a href="#unqualify_columns-747"><span class="linenos">747</span></a>
</span><span id="unqualify_columns-748"><a href="#unqualify_columns-748"><span class="linenos">748</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
</section>
<section id="remove_unique_constraints">
<input id="remove_unique_constraints-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">remove_unique_constraints</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="remove_unique_constraints-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#remove_unique_constraints"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_unique_constraints-751"><a href="#remove_unique_constraints-751"><span class="linenos">751</span></a><span class="k">def</span><span class="w"> </span><span class="nf">remove_unique_constraints</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="remove_unique_constraints-752"><a href="#remove_unique_constraints-752"><span class="linenos">752</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="remove_unique_constraints-753"><a href="#remove_unique_constraints-753"><span class="linenos">753</span></a> <span class="k">for</span> <span class="n">constraint</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">UniqueColumnConstraint</span><span class="p">):</span>
</span><span id="remove_unique_constraints-754"><a href="#remove_unique_constraints-754"><span class="linenos">754</span></a> <span class="k">if</span> <span class="n">constraint</span><span class="o">.</span><span class="n">parent</span><span class="p">:</span>
</span><span id="remove_unique_constraints-755"><a href="#remove_unique_constraints-755"><span class="linenos">755</span></a> <span class="n">constraint</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="remove_unique_constraints-756"><a href="#remove_unique_constraints-756"><span class="linenos">756</span></a>
</span><span id="remove_unique_constraints-757"><a href="#remove_unique_constraints-757"><span class="linenos">757</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
</section>
<section id="ctas_with_tmp_tables_to_create_tmp_view">
<input id="ctas_with_tmp_tables_to_create_tmp_view-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">ctas_with_tmp_tables_to_create_tmp_view</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>,</span><span class="param"> <span class="n">tmp_storage_provider</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">function</span> <span class="o">&lt;</span><span class="k">lambda</span><span class="o">&gt;&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="ctas_with_tmp_tables_to_create_tmp_view-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#ctas_with_tmp_tables_to_create_tmp_view"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="ctas_with_tmp_tables_to_create_tmp_view-760"><a href="#ctas_with_tmp_tables_to_create_tmp_view-760"><span class="linenos">760</span></a><span class="k">def</span><span class="w"> </span><span class="nf">ctas_with_tmp_tables_to_create_tmp_view</span><span class="p">(</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-761"><a href="#ctas_with_tmp_tables_to_create_tmp_view-761"><span class="linenos">761</span></a> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-762"><a href="#ctas_with_tmp_tables_to_create_tmp_view-762"><span class="linenos">762</span></a> <span class="n">tmp_storage_provider</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">e</span><span class="p">:</span> <span class="n">e</span><span class="p">,</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-763"><a href="#ctas_with_tmp_tables_to_create_tmp_view-763"><span class="linenos">763</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-764"><a href="#ctas_with_tmp_tables_to_create_tmp_view-764"><span class="linenos">764</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-765"><a href="#ctas_with_tmp_tables_to_create_tmp_view-765"><span class="linenos">765</span></a> <span class="n">properties</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;properties&quot;</span><span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-766"><a href="#ctas_with_tmp_tables_to_create_tmp_view-766"><span class="linenos">766</span></a> <span class="n">temporary</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-767"><a href="#ctas_with_tmp_tables_to_create_tmp_view-767"><span class="linenos">767</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-768"><a href="#ctas_with_tmp_tables_to_create_tmp_view-768"><span class="linenos">768</span></a> <span class="k">for</span> <span class="n">prop</span> <span class="ow">in</span> <span class="p">(</span><span class="n">properties</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">properties</span> <span class="k">else</span> <span class="p">[])</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-769"><a href="#ctas_with_tmp_tables_to_create_tmp_view-769"><span class="linenos">769</span></a> <span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-770"><a href="#ctas_with_tmp_tables_to_create_tmp_view-770"><span class="linenos">770</span></a>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-771"><a href="#ctas_with_tmp_tables_to_create_tmp_view-771"><span class="linenos">771</span></a> <span class="c1"># CTAS with temp tables map to CREATE TEMPORARY VIEW</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-772"><a href="#ctas_with_tmp_tables_to_create_tmp_view-772"><span class="linenos">772</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;TABLE&quot;</span> <span class="ow">and</span> <span class="n">temporary</span><span class="p">:</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-773"><a href="#ctas_with_tmp_tables_to_create_tmp_view-773"><span class="linenos">773</span></a> <span class="k">if</span> <span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-774"><a href="#ctas_with_tmp_tables_to_create_tmp_view-774"><span class="linenos">774</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Create</span><span class="p">(</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-775"><a href="#ctas_with_tmp_tables_to_create_tmp_view-775"><span class="linenos">775</span></a> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;TEMPORARY VIEW&quot;</span><span class="p">,</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-776"><a href="#ctas_with_tmp_tables_to_create_tmp_view-776"><span class="linenos">776</span></a> <span class="n">this</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-777"><a href="#ctas_with_tmp_tables_to_create_tmp_view-777"><span class="linenos">777</span></a> <span class="n">expression</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-778"><a href="#ctas_with_tmp_tables_to_create_tmp_view-778"><span class="linenos">778</span></a> <span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-779"><a href="#ctas_with_tmp_tables_to_create_tmp_view-779"><span class="linenos">779</span></a> <span class="k">return</span> <span class="n">tmp_storage_provider</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-780"><a href="#ctas_with_tmp_tables_to_create_tmp_view-780"><span class="linenos">780</span></a>
</span><span id="ctas_with_tmp_tables_to_create_tmp_view-781"><a href="#ctas_with_tmp_tables_to_create_tmp_view-781"><span class="linenos">781</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
</section>
<section id="move_schema_columns_to_partitioned_by">
<input id="move_schema_columns_to_partitioned_by-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">move_schema_columns_to_partitioned_by</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="move_schema_columns_to_partitioned_by-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#move_schema_columns_to_partitioned_by"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="move_schema_columns_to_partitioned_by-784"><a href="#move_schema_columns_to_partitioned_by-784"><span class="linenos">784</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_schema_columns_to_partitioned_by</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="move_schema_columns_to_partitioned_by-785"><a href="#move_schema_columns_to_partitioned_by-785"><span class="linenos">785</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="move_schema_columns_to_partitioned_by-786"><a href="#move_schema_columns_to_partitioned_by-786"><span class="linenos">786</span></a><span class="sd"> In Hive, the PARTITIONED BY property acts as an extension of a table&#39;s schema. When the</span>
</span><span id="move_schema_columns_to_partitioned_by-787"><a href="#move_schema_columns_to_partitioned_by-787"><span class="linenos">787</span></a><span class="sd"> PARTITIONED BY value is an array of column names, they are transformed into a schema.</span>
</span><span id="move_schema_columns_to_partitioned_by-788"><a href="#move_schema_columns_to_partitioned_by-788"><span class="linenos">788</span></a><span class="sd"> The corresponding columns are removed from the create statement.</span>
</span><span id="move_schema_columns_to_partitioned_by-789"><a href="#move_schema_columns_to_partitioned_by-789"><span class="linenos">789</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="move_schema_columns_to_partitioned_by-790"><a href="#move_schema_columns_to_partitioned_by-790"><span class="linenos">790</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="move_schema_columns_to_partitioned_by-791"><a href="#move_schema_columns_to_partitioned_by-791"><span class="linenos">791</span></a> <span class="n">has_schema</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">)</span>
</span><span id="move_schema_columns_to_partitioned_by-792"><a href="#move_schema_columns_to_partitioned_by-792"><span class="linenos">792</span></a> <span class="n">is_partitionable</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">kind</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;TABLE&quot;</span><span class="p">,</span> <span class="s2">&quot;VIEW&quot;</span><span class="p">}</span>
</span><span id="move_schema_columns_to_partitioned_by-793"><a href="#move_schema_columns_to_partitioned_by-793"><span class="linenos">793</span></a>
</span><span id="move_schema_columns_to_partitioned_by-794"><a href="#move_schema_columns_to_partitioned_by-794"><span class="linenos">794</span></a> <span class="k">if</span> <span class="n">has_schema</span> <span class="ow">and</span> <span class="n">is_partitionable</span><span class="p">:</span>
</span><span id="move_schema_columns_to_partitioned_by-795"><a href="#move_schema_columns_to_partitioned_by-795"><span class="linenos">795</span></a> <span class="n">prop</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">)</span>
</span><span id="move_schema_columns_to_partitioned_by-796"><a href="#move_schema_columns_to_partitioned_by-796"><span class="linenos">796</span></a> <span class="k">if</span> <span class="n">prop</span> <span class="ow">and</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">):</span>
</span><span id="move_schema_columns_to_partitioned_by-797"><a href="#move_schema_columns_to_partitioned_by-797"><span class="linenos">797</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="move_schema_columns_to_partitioned_by-798"><a href="#move_schema_columns_to_partitioned_by-798"><span class="linenos">798</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">v</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">}</span>
</span><span id="move_schema_columns_to_partitioned_by-799"><a href="#move_schema_columns_to_partitioned_by-799"><span class="linenos">799</span></a> <span class="n">partitions</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">schema</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">]</span>
</span><span id="move_schema_columns_to_partitioned_by-800"><a href="#move_schema_columns_to_partitioned_by-800"><span class="linenos">800</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">schema</span><span class="o">.</span><span class="n">expressions</span> <span class="k">if</span> <span class="n">e</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">partitions</span><span class="p">])</span>
</span><span id="move_schema_columns_to_partitioned_by-801"><a href="#move_schema_columns_to_partitioned_by-801"><span class="linenos">801</span></a> <span class="n">prop</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">PartitionedByProperty</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="n">partitions</span><span class="p">)))</span>
</span><span id="move_schema_columns_to_partitioned_by-802"><a href="#move_schema_columns_to_partitioned_by-802"><span class="linenos">802</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span>
</span><span id="move_schema_columns_to_partitioned_by-803"><a href="#move_schema_columns_to_partitioned_by-803"><span class="linenos">803</span></a>
</span><span id="move_schema_columns_to_partitioned_by-804"><a href="#move_schema_columns_to_partitioned_by-804"><span class="linenos">804</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>In Hive, the PARTITIONED BY property acts as an extension of a table's schema. When the
PARTITIONED BY value is an array of column names, they are transformed into a schema.
The corresponding columns are removed from the create statement.</p>
</div>
</section>
<section id="move_partitioned_by_to_schema_columns">
<input id="move_partitioned_by_to_schema_columns-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">move_partitioned_by_to_schema_columns</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="move_partitioned_by_to_schema_columns-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#move_partitioned_by_to_schema_columns"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="move_partitioned_by_to_schema_columns-807"><a href="#move_partitioned_by_to_schema_columns-807"><span class="linenos">807</span></a><span class="k">def</span><span class="w"> </span><span class="nf">move_partitioned_by_to_schema_columns</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="move_partitioned_by_to_schema_columns-808"><a href="#move_partitioned_by_to_schema_columns-808"><span class="linenos">808</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="move_partitioned_by_to_schema_columns-809"><a href="#move_partitioned_by_to_schema_columns-809"><span class="linenos">809</span></a><span class="sd"> Spark 3 supports both &quot;HIVEFORMAT&quot; and &quot;DATASOURCE&quot; formats for CREATE TABLE.</span>
</span><span id="move_partitioned_by_to_schema_columns-810"><a href="#move_partitioned_by_to_schema_columns-810"><span class="linenos">810</span></a>
</span><span id="move_partitioned_by_to_schema_columns-811"><a href="#move_partitioned_by_to_schema_columns-811"><span class="linenos">811</span></a><span class="sd"> Currently, SQLGlot uses the DATASOURCE format for Spark 3.</span>
</span><span id="move_partitioned_by_to_schema_columns-812"><a href="#move_partitioned_by_to_schema_columns-812"><span class="linenos">812</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="move_partitioned_by_to_schema_columns-813"><a href="#move_partitioned_by_to_schema_columns-813"><span class="linenos">813</span></a> <span class="k">assert</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">Create</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-814"><a href="#move_partitioned_by_to_schema_columns-814"><span class="linenos">814</span></a> <span class="n">prop</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-815"><a href="#move_partitioned_by_to_schema_columns-815"><span class="linenos">815</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="move_partitioned_by_to_schema_columns-816"><a href="#move_partitioned_by_to_schema_columns-816"><span class="linenos">816</span></a> <span class="n">prop</span>
</span><span id="move_partitioned_by_to_schema_columns-817"><a href="#move_partitioned_by_to_schema_columns-817"><span class="linenos">817</span></a> <span class="ow">and</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span>
</span><span id="move_partitioned_by_to_schema_columns-818"><a href="#move_partitioned_by_to_schema_columns-818"><span class="linenos">818</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Schema</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-819"><a href="#move_partitioned_by_to_schema_columns-819"><span class="linenos">819</span></a> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">)</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">kind</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-820"><a href="#move_partitioned_by_to_schema_columns-820"><span class="linenos">820</span></a> <span class="p">):</span>
</span><span id="move_partitioned_by_to_schema_columns-821"><a href="#move_partitioned_by_to_schema_columns-821"><span class="linenos">821</span></a> <span class="n">prop_this</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">(</span>
</span><span id="move_partitioned_by_to_schema_columns-822"><a href="#move_partitioned_by_to_schema_columns-822"><span class="linenos">822</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">]</span>
</span><span id="move_partitioned_by_to_schema_columns-823"><a href="#move_partitioned_by_to_schema_columns-823"><span class="linenos">823</span></a> <span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-824"><a href="#move_partitioned_by_to_schema_columns-824"><span class="linenos">824</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="move_partitioned_by_to_schema_columns-825"><a href="#move_partitioned_by_to_schema_columns-825"><span class="linenos">825</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">prop</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="move_partitioned_by_to_schema_columns-826"><a href="#move_partitioned_by_to_schema_columns-826"><span class="linenos">826</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-827"><a href="#move_partitioned_by_to_schema_columns-827"><span class="linenos">827</span></a> <span class="n">prop</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">prop_this</span><span class="p">)</span>
</span><span id="move_partitioned_by_to_schema_columns-828"><a href="#move_partitioned_by_to_schema_columns-828"><span class="linenos">828</span></a>
</span><span id="move_partitioned_by_to_schema_columns-829"><a href="#move_partitioned_by_to_schema_columns-829"><span class="linenos">829</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Spark 3 supports both "HIVEFORMAT" and "DATASOURCE" formats for CREATE TABLE.</p>
<p>Currently, SQLGlot uses the DATASOURCE format for Spark 3.</p>
</div>
</section>
<section id="struct_kv_to_alias">
<input id="struct_kv_to_alias-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">struct_kv_to_alias</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="struct_kv_to_alias-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#struct_kv_to_alias"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="struct_kv_to_alias-832"><a href="#struct_kv_to_alias-832"><span class="linenos">832</span></a><span class="k">def</span><span class="w"> </span><span class="nf">struct_kv_to_alias</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="struct_kv_to_alias-833"><a href="#struct_kv_to_alias-833"><span class="linenos">833</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts struct arguments to aliases, e.g. STRUCT(1 AS y).&quot;&quot;&quot;</span>
</span><span id="struct_kv_to_alias-834"><a href="#struct_kv_to_alias-834"><span class="linenos">834</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
</span><span id="struct_kv_to_alias-835"><a href="#struct_kv_to_alias-835"><span class="linenos">835</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="struct_kv_to_alias-836"><a href="#struct_kv_to_alias-836"><span class="linenos">836</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="struct_kv_to_alias-837"><a href="#struct_kv_to_alias-837"><span class="linenos">837</span></a> <span class="p">[</span>
</span><span id="struct_kv_to_alias-838"><a href="#struct_kv_to_alias-838"><span class="linenos">838</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="struct_kv_to_alias-839"><a href="#struct_kv_to_alias-839"><span class="linenos">839</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="struct_kv_to_alias-840"><a href="#struct_kv_to_alias-840"><span class="linenos">840</span></a> <span class="p">],</span>
</span><span id="struct_kv_to_alias-841"><a href="#struct_kv_to_alias-841"><span class="linenos">841</span></a> <span class="p">)</span>
</span><span id="struct_kv_to_alias-842"><a href="#struct_kv_to_alias-842"><span class="linenos">842</span></a>
</span><span id="struct_kv_to_alias-843"><a href="#struct_kv_to_alias-843"><span class="linenos">843</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Converts struct arguments to aliases, e.g. STRUCT(1 AS y).</p>
</div>
</section>
<section id="eliminate_join_marks">
<input id="eliminate_join_marks-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_join_marks</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_join_marks-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_join_marks"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_join_marks-846"><a href="#eliminate_join_marks-846"><span class="linenos">846</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-847"><a href="#eliminate_join_marks-847"><span class="linenos">847</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_join_marks-848"><a href="#eliminate_join_marks-848"><span class="linenos">848</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-849"><a href="#eliminate_join_marks-849"><span class="linenos">849</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-850"><a href="#eliminate_join_marks-850"><span class="linenos">850</span></a>
</span><span id="eliminate_join_marks-851"><a href="#eliminate_join_marks-851"><span class="linenos">851</span></a><span class="sd"> For example,</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, b WHERE a.id = b.id(+) -- ... is converted to</span>
</span><span id="eliminate_join_marks-853"><a href="#eliminate_join_marks-853"><span class="linenos">853</span></a><span class="sd"> SELECT * FROM a LEFT JOIN b ON a.id = b.id -- this</span>
</span><span id="eliminate_join_marks-854"><a href="#eliminate_join_marks-854"><span class="linenos">854</span></a>
</span><span id="eliminate_join_marks-855"><a href="#eliminate_join_marks-855"><span class="linenos">855</span></a><span class="sd"> Args:</span>
</span><span id="eliminate_join_marks-856"><a href="#eliminate_join_marks-856"><span class="linenos">856</span></a><span class="sd"> expression: The AST to remove join marks from.</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"> Returns:</span>
</span><span id="eliminate_join_marks-859"><a href="#eliminate_join_marks-859"><span class="linenos">859</span></a><span class="sd"> The AST with join marks removed.</span>
</span><span id="eliminate_join_marks-860"><a href="#eliminate_join_marks-860"><span class="linenos">860</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_join_marks-861"><a href="#eliminate_join_marks-861"><span class="linenos">861</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-862"><a href="#eliminate_join_marks-862"><span class="linenos">862</span></a>
</span><span id="eliminate_join_marks-863"><a href="#eliminate_join_marks-863"><span class="linenos">863</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-864"><a href="#eliminate_join_marks-864"><span class="linenos">864</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-865"><a href="#eliminate_join_marks-865"><span class="linenos">865</span></a>
</span><span id="eliminate_join_marks-866"><a href="#eliminate_join_marks-866"><span class="linenos">866</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-867"><a href="#eliminate_join_marks-867"><span class="linenos">867</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-868"><a href="#eliminate_join_marks-868"><span class="linenos">868</span></a>
</span><span id="eliminate_join_marks-869"><a href="#eliminate_join_marks-869"><span class="linenos">869</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-870"><a href="#eliminate_join_marks-870"><span class="linenos">870</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-871"><a href="#eliminate_join_marks-871"><span class="linenos">871</span></a>
</span><span id="eliminate_join_marks-872"><a href="#eliminate_join_marks-872"><span class="linenos">872</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-873"><a href="#eliminate_join_marks-873"><span class="linenos">873</span></a>
</span><span id="eliminate_join_marks-874"><a href="#eliminate_join_marks-874"><span class="linenos">874</span></a> <span class="c1"># These keep track of the joins to be replaced</span>
</span><span id="eliminate_join_marks-875"><a href="#eliminate_join_marks-875"><span class="linenos">875</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-876"><a href="#eliminate_join_marks-876"><span class="linenos">876</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-877"><a href="#eliminate_join_marks-877"><span class="linenos">877</span></a>
</span><span id="eliminate_join_marks-878"><a href="#eliminate_join_marks-878"><span class="linenos">878</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-879"><a href="#eliminate_join_marks-879"><span class="linenos">879</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-880"><a href="#eliminate_join_marks-880"><span class="linenos">880</span></a> <span class="k">continue</span>
</span><span id="eliminate_join_marks-881"><a href="#eliminate_join_marks-881"><span class="linenos">881</span></a>
</span><span id="eliminate_join_marks-882"><a href="#eliminate_join_marks-882"><span class="linenos">882</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-883"><a href="#eliminate_join_marks-883"><span class="linenos">883</span></a> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="eliminate_join_marks-884"><a href="#eliminate_join_marks-884"><span class="linenos">884</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-885"><a href="#eliminate_join_marks-885"><span class="linenos">885</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-886"><a href="#eliminate_join_marks-886"><span class="linenos">886</span></a>
</span><span id="eliminate_join_marks-887"><a href="#eliminate_join_marks-887"><span class="linenos">887</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-888"><a href="#eliminate_join_marks-888"><span class="linenos">888</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-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="n">left_columns</span> <span class="o">=</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="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-892"><a href="#eliminate_join_marks-892"><span class="linenos">892</span></a> <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">right_columns</span> <span class="o">=</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="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-895"><a href="#eliminate_join_marks-895"><span class="linenos">895</span></a> <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="k">assert</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="eliminate_join_marks-898"><a href="#eliminate_join_marks-898"><span class="linenos">898</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-899"><a href="#eliminate_join_marks-899"><span class="linenos">899</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-900"><a href="#eliminate_join_marks-900"><span class="linenos">900</span></a>
</span><span id="eliminate_join_marks-901"><a href="#eliminate_join_marks-901"><span class="linenos">901</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-902"><a href="#eliminate_join_marks-902"><span class="linenos">902</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-903"><a href="#eliminate_join_marks-903"><span class="linenos">903</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-904"><a href="#eliminate_join_marks-904"><span class="linenos">904</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-905"><a href="#eliminate_join_marks-905"><span class="linenos">905</span></a>
</span><span id="eliminate_join_marks-906"><a href="#eliminate_join_marks-906"><span class="linenos">906</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-907"><a href="#eliminate_join_marks-907"><span class="linenos">907</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-908"><a href="#eliminate_join_marks-908"><span class="linenos">908</span></a>
</span><span id="eliminate_join_marks-909"><a href="#eliminate_join_marks-909"><span class="linenos">909</span></a> <span class="k">assert</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="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-911"><a href="#eliminate_join_marks-911"><span class="linenos">911</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-912"><a href="#eliminate_join_marks-912"><span class="linenos">912</span></a>
</span><span id="eliminate_join_marks-913"><a href="#eliminate_join_marks-913"><span class="linenos">913</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-914"><a href="#eliminate_join_marks-914"><span class="linenos">914</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-915"><a href="#eliminate_join_marks-915"><span class="linenos">915</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-916"><a href="#eliminate_join_marks-916"><span class="linenos">916</span></a> <span class="k">if</span> <span class="n">existing_join</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="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-918"><a href="#eliminate_join_marks-918"><span class="linenos">918</span></a> <span class="k">else</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">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-920"><a href="#eliminate_join_marks-920"><span class="linenos">920</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-921"><a href="#eliminate_join_marks-921"><span class="linenos">921</span></a> <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="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-924"><a href="#eliminate_join_marks-924"><span class="linenos">924</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-925"><a href="#eliminate_join_marks-925"><span class="linenos">925</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-926"><a href="#eliminate_join_marks-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">right</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="k">else</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 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-929"><a href="#eliminate_join_marks-929"><span class="linenos">929</span></a>
</span><span id="eliminate_join_marks-930"><a href="#eliminate_join_marks-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="eliminate_join_marks-931"><a href="#eliminate_join_marks-931"><span class="linenos">931</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-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_joins</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_joins</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="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><span id="eliminate_join_marks-939"><a href="#eliminate_join_marks-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="eliminate_join_marks-940"><a href="#eliminate_join_marks-940"><span class="linenos">940</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-941"><a href="#eliminate_join_marks-941"><span class="linenos">941</span></a>
</span><span id="eliminate_join_marks-942"><a href="#eliminate_join_marks-942"><span class="linenos">942</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-943"><a href="#eliminate_join_marks-943"><span class="linenos">943</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-944"><a href="#eliminate_join_marks-944"><span class="linenos">944</span></a>
</span><span id="eliminate_join_marks-945"><a href="#eliminate_join_marks-945"><span class="linenos">945</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>
<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>
<h6 id="arguments">Arguments:</h6>
<ul>
<li><strong>expression:</strong> The AST to remove join marks from.</li>
</ul>
<h6 id="returns">Returns:</h6>
<blockquote>
<p>The AST with join marks removed.</p>
</blockquote>
</div>
</section>
<section id="any_to_exists">
<input id="any_to_exists-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">any_to_exists</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="any_to_exists-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#any_to_exists"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="any_to_exists-948"><a href="#any_to_exists-948"><span class="linenos">948</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-949"><a href="#any_to_exists-949"><span class="linenos">949</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="any_to_exists-950"><a href="#any_to_exists-950"><span class="linenos">950</span></a><span class="sd"> Transform ANY operator to Spark&#39;s EXISTS</span>
</span><span id="any_to_exists-951"><a href="#any_to_exists-951"><span class="linenos">951</span></a>
</span><span id="any_to_exists-952"><a href="#any_to_exists-952"><span class="linenos">952</span></a><span class="sd"> For example,</span>
</span><span id="any_to_exists-953"><a href="#any_to_exists-953"><span class="linenos">953</span></a><span class="sd"> - Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)</span>
</span><span id="any_to_exists-954"><a href="#any_to_exists-954"><span class="linenos">954</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-955"><a href="#any_to_exists-955"><span class="linenos">955</span></a>
</span><span id="any_to_exists-956"><a href="#any_to_exists-956"><span class="linenos">956</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-957"><a href="#any_to_exists-957"><span class="linenos">957</span></a><span class="sd"> transformation</span>
</span><span id="any_to_exists-958"><a href="#any_to_exists-958"><span class="linenos">958</span></a><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="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-960"><a href="#any_to_exists-960"><span class="linenos">960</span></a> <span class="k">for</span> <span class="nb">any</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-961"><a href="#any_to_exists-961"><span class="linenos">961</span></a> <span class="n">this</span> <span class="o">=</span> <span class="nb">any</span><span class="o">.</span><span class="n">this</span>
</span><span id="any_to_exists-962"><a href="#any_to_exists-962"><span class="linenos">962</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-963"><a href="#any_to_exists-963"><span class="linenos">963</span></a> <span class="k">continue</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="n">binop</span> <span class="o">=</span> <span class="nb">any</span><span class="o">.</span><span class="n">parent</span>
</span><span id="any_to_exists-966"><a href="#any_to_exists-966"><span class="linenos">966</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-967"><a href="#any_to_exists-967"><span class="linenos">967</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-968"><a href="#any_to_exists-968"><span class="linenos">968</span></a> <span class="nb">any</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-969"><a href="#any_to_exists-969"><span class="linenos">969</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-970"><a href="#any_to_exists-970"><span class="linenos">970</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-971"><a href="#any_to_exists-971"><span class="linenos">971</span></a>
</span><span id="any_to_exists-972"><a href="#any_to_exists-972"><span class="linenos">972</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Transform ANY operator to Spark's EXISTS</p>
<p>For example,
- Postgres: SELECT * FROM tbl WHERE 5 &gt; ANY(tbl.col)
- Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -> x &lt; 5)</p>
<p>Both ANY and EXISTS accept queries but currently only array expressions are supported for this
transformation</p>
</div>
</section>
</main>
<script>
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
const originalContent = document.querySelector("main.pdoc");
let currentContent = originalContent;
function setContent(innerHTML) {
let elem;
if (innerHTML) {
elem = document.createElement("main");
elem.classList.add("pdoc");
elem.innerHTML = innerHTML;
} else {
elem = originalContent;
}
if (currentContent !== elem) {
currentContent.replaceWith(elem);
currentContent = elem;
}
}
function getSearchTerm() {
return (new URL(window.location)).searchParams.get("search");
}
const searchBox = document.querySelector(".pdoc input[type=search]");
searchBox.addEventListener("input", function () {
let url = new URL(window.location);
if (searchBox.value.trim()) {
url.hash = "";
url.searchParams.set("search", searchBox.value);
} else {
url.searchParams.delete("search");
}
history.replaceState("", "", url.toString());
onInput();
});
window.addEventListener("popstate", onInput);
let search, searchErr;
async function initialize() {
try {
search = await new Promise((resolve, reject) => {
const script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.onload = () => resolve(window.pdocSearch);
script.onerror = (e) => reject(e);
script.src = "../search.js";
document.getElementsByTagName("head")[0].appendChild(script);
});
} catch (e) {
console.error("Cannot fetch pdoc search index");
searchErr = "Cannot fetch search index.";
}
onInput();
document.querySelector("nav.pdoc").addEventListener("click", e => {
if (e.target.hash) {
searchBox.value = "";
searchBox.dispatchEvent(new Event("input"));
}
});
}
function onInput() {
setContent((() => {
const term = getSearchTerm();
if (!term) {
return null
}
if (searchErr) {
return `<h3>Error: ${searchErr}</h3>`
}
if (!search) {
return "<h3>Searching...</h3>"
}
window.scrollTo({top: 0, left: 0, behavior: 'auto'});
const results = search(term);
let html;
if (results.length === 0) {
html = `No search results for '${escapeHTML(term)}'.`
} else {
html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
}
for (let result of results.slice(0, 10)) {
let doc = result.doc;
let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
if (doc.qualname) {
url += `#${doc.qualname}`;
}
let heading;
switch (result.doc.kind) {
case "function":
if (doc.fullname.endsWith(".__init__")) {
heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
} else {
heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
}
break;
case "class":
heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
if (doc.bases)
heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
heading += `:`;
break;
case "variable":
heading = `<span class="name">${doc.fullname}</span>`;
if (doc.annotation)
heading += `<span class="annotation">${doc.annotation}</span>`;
if (doc.default_value)
heading += `<span class="default_value"> = ${doc.default_value}</span>`;
break;
default:
heading = `<span class="name">${doc.fullname}</span>`;
break;
}
html += `
<section class="search-result">
<a href="${url}" class="attr ${doc.kind}">${heading}</a>
<div class="docstring">${doc.doc}</div>
</section>
`;
}
return html;
})());
}
if (getSearchTerm()) {
initialize();
searchBox.value = getSearchTerm();
onInput();
} else {
searchBox.addEventListener("focus", initialize, {once: true});
}
searchBox.addEventListener("keydown", e => {
if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
let focused = currentContent.querySelector(".search-result.focused");
if (!focused) {
currentContent.querySelector(".search-result").classList.add("focused");
} else if (
e.key === "ArrowDown"
&& focused.nextElementSibling
&& focused.nextElementSibling.classList.contains("search-result")
) {
focused.classList.remove("focused");
focused.nextElementSibling.classList.add("focused");
focused.nextElementSibling.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
} else if (
e.key === "ArrowUp"
&& focused.previousElementSibling
&& focused.previousElementSibling.classList.contains("search-result")
) {
focused.classList.remove("focused");
focused.previousElementSibling.classList.add("focused");
focused.previousElementSibling.scrollIntoView({
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
} else if (
e.key === "Enter"
) {
focused.querySelector("a").click();
}
}
});
</script></body>
</html>