diff options
Diffstat (limited to 'docs/sqlglot.html')
-rw-r--r-- | docs/sqlglot.html | 1226 |
1 files changed, 1226 insertions, 0 deletions
diff --git a/docs/sqlglot.html b/docs/sqlglot.html new file mode 100644 index 0000000..e7a1724 --- /dev/null +++ b/docs/sqlglot.html @@ -0,0 +1,1226 @@ +<!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 12.3.1"/> + <title>sqlglot API documentation</title> + + <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style> + <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;}#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 }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{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bottom:0;}.pdoc .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 .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 .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(--code);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 .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 .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> + + <input type="search" placeholder="Search..." role="searchbox" aria-label="search" + pattern=".+" required> + + <h2>Contents</h2> + <ul> + <li><a href="#sqlglot">SQLGlot</a> + <ul> + <li><a href="#table-of-contents">Table of Contents</a></li> + <li><a href="#install">Install</a></li> + <li><a href="#get-in-touch">Get in Touch</a></li> + <li><a href="#examples">Examples</a></li> + <li><a href="#used-by">Used By</a></li> + <li><a href="#documentation">Documentation</a></li> + <li><a href="#run-tests-and-lint">Run Tests and Lint</a></li> + <li><a href="#benchmarks">Benchmarks</a></li> + <li><a href="#optional-dependencies">Optional Dependencies</a></li> + </ul></li> +</ul> + + + <h2>Submodules</h2> + <ul> + <li><a href="sqlglot/dataframe.html">dataframe</a></li> + <li><a href="sqlglot/dialects.html">dialects</a></li> + <li><a href="sqlglot/diff.html">diff</a></li> + <li><a href="sqlglot/errors.html">errors</a></li> + <li><a href="sqlglot/executor.html">executor</a></li> + <li><a href="sqlglot/expressions.html">expressions</a></li> + <li><a href="sqlglot/generator.html">generator</a></li> + <li><a href="sqlglot/helper.html">helper</a></li> + <li><a href="sqlglot/lineage.html">lineage</a></li> + <li><a href="sqlglot/optimizer.html">optimizer</a></li> + <li><a href="sqlglot/parser.html">parser</a></li> + <li><a href="sqlglot/planner.html">planner</a></li> + <li><a href="sqlglot/schema.html">schema</a></li> + <li><a href="sqlglot/serde.html">serde</a></li> + <li><a href="sqlglot/time.html">time</a></li> + <li><a href="sqlglot/tokens.html">tokens</a></li> + <li><a href="sqlglot/transforms.html">transforms</a></li> + <li><a href="sqlglot/trie.html">trie</a></li> + </ul> + + <h2>API Documentation</h2> + <ul class="memberlist"> + <li> + <a class="variable" href="#pretty">pretty</a> + </li> + <li> + <a class="variable" href="#schema">schema</a> + </li> + <li> + <a class="function" href="#parse">parse</a> + </li> + <li> + <a class="function" href="#parse_one">parse_one</a> + </li> + <li> + <a class="function" href="#transpile">transpile</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/__init__.py">Edit on GitHub</a> + + <div class="docstring"><h1 id="sqlglot">SQLGlot</h1> + +<p>SQLGlot is a no-dependency SQL parser, transpiler, optimizer, and engine. It can be used to format SQL or translate between <a href="https://github.com/tobymao/sqlglot/blob/main/sqlglot/dialects/__init__.py">19 different dialects</a> like <a href="https://duckdb.org/">DuckDB</a>, <a href="https://prestodb.io/">Presto</a>, <a href="https://spark.apache.org/">Spark</a>, <a href="https://www.snowflake.com/en/">Snowflake</a>, and <a href="https://cloud.google.com/bigquery/">BigQuery</a>. It aims to read a wide variety of SQL inputs and output syntactically correct SQL in the targeted dialects.</p> + +<p>It is a very comprehensive generic SQL parser with a robust <a href="https://github.com/tobymao/sqlglot/blob/main/tests/">test suite</a>. It is also quite <a href="#benchmarks">performant</a>, while being written purely in Python.</p> + +<p>You can easily <a href="#custom-dialects">customize</a> the parser, <a href="#metadata">analyze</a> queries, traverse expression trees, and programmatically <a href="#build-and-modify-sql">build</a> SQL.</p> + +<p>Syntax <a href="#parser-errors">errors</a> are highlighted and dialect incompatibilities can warn or raise depending on configurations. However, it should be noted that SQL validation is not SQLGlot’s goal, so some syntax errors may go unnoticed.</p> + +<p>Contributions are very welcome in SQLGlot; read the <a href="https://github.com/tobymao/sqlglot/blob/main/CONTRIBUTING.md">contribution guide</a> to get started!</p> + +<h2 id="table-of-contents">Table of Contents</h2> + +<ul> +<li><a href="#install">Install</a></li> +<li><a href="#get-in-touch">Get in Touch</a></li> +<li><a href="#examples">Examples</a> +<ul> +<li><a href="#formatting-and-transpiling">Formatting and Transpiling</a></li> +<li><a href="#metadata">Metadata</a></li> +<li><a href="#parser-errors">Parser Errors</a></li> +<li><a href="#unsupported-errors">Unsupported Errors</a></li> +<li><a href="#build-and-modify-sql">Build and Modify SQL</a></li> +<li><a href="#sql-optimizer">SQL Optimizer</a></li> +<li><a href="#ast-introspection">AST Introspection</a></li> +<li><a href="#ast-diff">AST Diff</a></li> +<li><a href="#custom-dialects">Custom Dialects</a></li> +<li><a href="#sql-execution">SQL Execution</a></li> +</ul></li> +<li><a href="#used-by">Used By</a></li> +<li><a href="#documentation">Documentation</a></li> +<li><a href="#run-tests-and-lint">Run Tests and Lint</a></li> +<li><a href="#benchmarks">Benchmarks</a></li> +<li><a href="#optional-dependencies">Optional Dependencies</a></li> +</ul> + +<h2 id="install">Install</h2> + +<p>From PyPI:</p> + +<pre><code>pip3 install sqlglot +</code></pre> + +<p>Or with a local checkout:</p> + +<pre><code>make install +</code></pre> + +<p>Requirements for development (optional):</p> + +<pre><code>make install-dev +</code></pre> + +<h2 id="get-in-touch">Get in Touch</h2> + +<p>We'd love to hear from you. Join our community <a href="https://join.slack.com/t/tobiko-data/shared_invite/zt-1ma66d79v-a4dbf4DUpLAQJ8ptQrJygg">Slack channel</a>!</p> + +<h2 id="examples">Examples</h2> + +<h3 id="formatting-and-transpiling">Formatting and Transpiling</h3> + +<p>Easily translate from one dialect to another. For example, date/time functions vary from dialects and can be hard to deal with:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="s2">"SELECT EPOCH_MS(1618088028295)"</span><span class="p">,</span> <span class="n">read</span><span class="o">=</span><span class="s2">"duckdb"</span><span class="p">,</span> <span class="n">write</span><span class="o">=</span><span class="s2">"hive"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="s1">'SELECT FROM_UNIXTIME(1618088028295 / 1000)'</span> +</code></pre> +</div> + +<p>SQLGlot can even translate custom time formats:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="s2">"SELECT STRFTIME(x, '%y-%-m-%S')"</span><span class="p">,</span> <span class="n">read</span><span class="o">=</span><span class="s2">"duckdb"</span><span class="p">,</span> <span class="n">write</span><span class="o">=</span><span class="s2">"hive"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="ss">"SELECT DATE_FORMAT(x, 'yy-M-ss')"</span> +</code></pre> +</div> + +<p>As another example, let's suppose that we want to read in a SQL query that contains a CTE and a cast to <code>REAL</code>, and then transpile it to Spark, which uses backticks for identifiers and <code>FLOAT</code> instead of <code>REAL</code>:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> + +<span class="n">sql</span> <span class="o">=</span> <span class="s2">"""WITH baz AS (SELECT a, c FROM foo WHERE a = 1) SELECT f.a, b.b, baz.c, CAST("b"."a" AS REAL) d FROM foo f JOIN bar b ON f.a = b.a LEFT JOIN baz ON f.a = baz.a"""</span> +<span class="nb">print</span><span class="p">(</span><span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">write</span><span class="o">=</span><span class="s2">"spark"</span><span class="p">,</span> <span class="n">identify</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">pretty</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="k">WITH</span><span class="w"> </span><span class="o">`</span><span class="n">baz</span><span class="o">`</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="p">(</span> +<span class="w"> </span><span class="k">SELECT</span> +<span class="w"> </span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="p">,</span> +<span class="w"> </span><span class="o">`</span><span class="k">c</span><span class="o">`</span> +<span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="o">`</span><span class="n">foo</span><span class="o">`</span> +<span class="w"> </span><span class="k">WHERE</span> +<span class="w"> </span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span> +<span class="p">)</span> +<span class="k">SELECT</span> +<span class="w"> </span><span class="o">`</span><span class="n">f</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="p">,</span> +<span class="w"> </span><span class="o">`</span><span class="n">b</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">b</span><span class="o">`</span><span class="p">,</span> +<span class="w"> </span><span class="o">`</span><span class="n">baz</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="k">c</span><span class="o">`</span><span class="p">,</span> +<span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="o">`</span><span class="n">b</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">FLOAT</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="o">`</span><span class="n">d</span><span class="o">`</span> +<span class="k">FROM</span><span class="w"> </span><span class="o">`</span><span class="n">foo</span><span class="o">`</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="o">`</span><span class="n">f</span><span class="o">`</span> +<span class="k">JOIN</span><span class="w"> </span><span class="o">`</span><span class="n">bar</span><span class="o">`</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="o">`</span><span class="n">b</span><span class="o">`</span> +<span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="o">`</span><span class="n">f</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">`</span><span class="n">b</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span> +<span class="k">LEFT</span><span class="w"> </span><span class="k">JOIN</span><span class="w"> </span><span class="o">`</span><span class="n">baz</span><span class="o">`</span> +<span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="o">`</span><span class="n">f</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">`</span><span class="n">baz</span><span class="o">`</span><span class="p">.</span><span class="o">`</span><span class="n">a</span><span class="o">`</span> +</code></pre> +</div> + +<p>Comments are also preserved in a best-effort basis when transpiling SQL code:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="n">sql</span> <span class="o">=</span> <span class="s2">"""</span> +<span class="s2">/* multi</span> +<span class="s2"> line</span> +<span class="s2"> comment</span> +<span class="s2">*/</span> +<span class="s2">SELECT</span> +<span class="s2"> tbl.cola /* comment 1 */ + tbl.colb /* comment 2 */,</span> +<span class="s2"> CAST(x AS INT), # comment 3</span> +<span class="s2"> y -- comment 4</span> +<span class="s2">FROM</span> +<span class="s2"> bar /* comment 5 */,</span> +<span class="s2"> tbl # comment 6</span> +<span class="s2">"""</span> + +<span class="nb">print</span><span class="p">(</span><span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">read</span><span class="o">=</span><span class="s1">'mysql'</span><span class="p">,</span> <span class="n">pretty</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="cm">/* multi</span> +<span class="cm"> line</span> +<span class="cm"> comment</span> +<span class="cm">*/</span> +<span class="k">SELECT</span> +<span class="w"> </span><span class="n">tbl</span><span class="p">.</span><span class="n">cola</span><span class="w"> </span><span class="cm">/* comment 1 */</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">tbl</span><span class="p">.</span><span class="n">colb</span><span class="w"> </span><span class="cm">/* comment 2 */</span><span class="p">,</span> +<span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">INT</span><span class="p">),</span><span class="w"> </span><span class="cm">/* comment 3 */</span> +<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="cm">/* comment 4 */</span> +<span class="k">FROM</span><span class="w"> </span><span class="n">bar</span><span class="w"> </span><span class="cm">/* comment 5 */</span><span class="p">,</span><span class="w"> </span><span class="n">tbl</span><span class="w"> </span><span class="cm">/* comment 6 */</span> +</code></pre> +</div> + +<h3 id="metadata">Metadata</h3> + +<p>You can explore SQL with expression helpers to do things like find columns and tables:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">parse_one</span><span class="p">,</span> <span class="n">exp</span> + +<span class="c1"># print all column references (a and b)</span> +<span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT a, b + 1 AS c FROM d"</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="n">column</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span> + +<span class="c1"># find all projections in select statements (a and c)</span> +<span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT a, b + 1 AS c FROM d"</span><span class="p">)</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">Select</span><span class="p">):</span> + <span class="k">for</span> <span class="n">projection</span> <span class="ow">in</span> <span class="n">select</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="n">projection</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">)</span> + +<span class="c1"># find all tables (x, y, z)</span> +<span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT * FROM x JOIN y JOIN z"</span><span class="p">)</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">Table</span><span class="p">):</span> + <span class="nb">print</span><span class="p">(</span><span class="n">table</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +</code></pre> +</div> + +<h3 id="parser-errors">Parser Errors</h3> + +<p>When the parser detects an error in the syntax, it raises a ParserError:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="s2">"SELECT foo( FROM bar"</span><span class="p">)</span> +</code></pre> +</div> + +<pre><code><a href="sqlglot/errors.html#ParseError">sqlglot.errors.ParseError</a>: Expecting ). Line 1, Col: 13. + select foo( FROM bar + ~~~~ +</code></pre> + +<p>Structured syntax errors are accessible for programmatic use:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="k">try</span><span class="p">:</span> + <span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="s2">"SELECT foo( FROM bar"</span><span class="p">)</span> +<span class="k">except</span> <span class="n"><a href="sqlglot/errors.html#ParseError">sqlglot.errors.ParseError</a></span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">errors</span><span class="p">)</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="p">[{</span> + <span class="s1">'description'</span><span class="p">:</span> <span class="s1">'Expecting )'</span><span class="p">,</span> + <span class="s1">'line'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> + <span class="s1">'col'</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span> + <span class="s1">'start_context'</span><span class="p">:</span> <span class="s1">'SELECT foo( '</span><span class="p">,</span> + <span class="s1">'highlight'</span><span class="p">:</span> <span class="s1">'FROM'</span><span class="p">,</span> + <span class="s1">'end_context'</span><span class="p">:</span> <span class="s1">' bar'</span> +<span class="p">}]</span> +</code></pre> +</div> + +<h3 id="unsupported-errors">Unsupported Errors</h3> + +<p>Presto <code>APPROX_DISTINCT</code> supports the accuracy argument which is not supported in Hive:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="n"><a href="#transpile">sqlglot.transpile</a></span><span class="p">(</span><span class="s2">"SELECT APPROX_DISTINCT(a, 0.1) FROM foo"</span><span class="p">,</span> <span class="n">read</span><span class="o">=</span><span class="s2">"presto"</span><span class="p">,</span> <span class="n">write</span><span class="o">=</span><span class="s2">"hive"</span><span class="p">)</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="n">APPROX_COUNT_DISTINCT</span><span class="w"> </span><span class="n">does</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="n">support</span><span class="w"> </span><span class="n">accuracy</span> +<span class="s1">'SELECT APPROX_COUNT_DISTINCT(a) FROM foo'</span> +</code></pre> +</div> + +<h3 id="build-and-modify-sql">Build and Modify SQL</h3> + +<p>SQLGlot supports incrementally building sql expressions:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">select</span><span class="p">,</span> <span class="n">condition</span> + +<span class="n">where</span> <span class="o">=</span> <span class="n">condition</span><span class="p">(</span><span class="s2">"x=1"</span><span class="p">)</span><span class="o">.</span><span class="n">and_</span><span class="p">(</span><span class="s2">"y=1"</span><span class="p">)</span> +<span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="s2">"y"</span><span class="p">)</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">where</span><span class="p">)</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="s1">'SELECT * FROM y WHERE x = 1 AND y = 1'</span> +</code></pre> +</div> + +<p>You can also modify a parsed tree:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">parse_one</span> +<span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT x FROM y"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="s2">"z"</span><span class="p">)</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="s1">'SELECT x FROM y, z'</span> +</code></pre> +</div> + +<p>There is also a way to recursively transform the parsed tree by applying a mapping function to each tree node:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">exp</span><span class="p">,</span> <span class="n">parse_one</span> + +<span class="n">expression_tree</span> <span class="o">=</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT a FROM x"</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">transformer</span><span class="p">(</span><span class="n">node</span><span class="p">):</span> + <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">"a"</span><span class="p">:</span> + <span class="k">return</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"FUN(a)"</span><span class="p">)</span> + <span class="k">return</span> <span class="n">node</span> + +<span class="n">transformed_tree</span> <span class="o">=</span> <span class="n">expression_tree</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">transformer</span><span class="p">)</span> +<span class="n">transformed_tree</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="s1">'SELECT FUN(a) FROM x'</span> +</code></pre> +</div> + +<h3 id="sql-optimizer">SQL Optimizer</h3> + +<p>SQLGlot can rewrite queries into an "optimized" form. It performs a variety of <a href="https://github.com/tobymao/sqlglot/blob/main/sqlglot/optimizer/optimizer.py">techniques</a> to create a new canonical AST. This AST can be used to standardize queries or provide the foundations for implementing an actual engine. For example:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">import</span> <span class="nn">sqlglot</span> +<span class="kn">from</span> <span class="nn"><a href="sqlglot/optimizer.html">sqlglot.optimizer</a></span> <span class="kn">import</span> <span class="n">optimize</span> + +<span class="nb">print</span><span class="p">(</span> + <span class="n">optimize</span><span class="p">(</span> + <span class="n"><a href="#parse_one">sqlglot.parse_one</a></span><span class="p">(</span><span class="s2">"""</span> +<span class="s2"> SELECT A OR (B OR (C AND D))</span> +<span class="s2"> FROM x</span> +<span class="s2"> WHERE Z = date '2021-01-01' + INTERVAL '1' month OR 1 = 0</span> +<span class="s2"> """</span><span class="p">),</span> + <span class="n">schema</span><span class="o">=</span><span class="p">{</span><span class="s2">"x"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"A"</span><span class="p">:</span> <span class="s2">"INT"</span><span class="p">,</span> <span class="s2">"B"</span><span class="p">:</span> <span class="s2">"INT"</span><span class="p">,</span> <span class="s2">"C"</span><span class="p">:</span> <span class="s2">"INT"</span><span class="p">,</span> <span class="s2">"D"</span><span class="p">:</span> <span class="s2">"INT"</span><span class="p">,</span> <span class="s2">"Z"</span><span class="p">:</span> <span class="s2">"STRING"</span><span class="p">}}</span> + <span class="p">)</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">pretty</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> +<span class="p">)</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="k">SELECT</span> +<span class="w"> </span><span class="p">(</span> +<span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"a"</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"b"</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"c"</span> +<span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="p">(</span> +<span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"a"</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"b"</span><span class="w"> </span><span class="k">OR</span><span class="w"> </span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"d"</span> +<span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="ss">"_col_0"</span> +<span class="k">FROM</span><span class="w"> </span><span class="ss">"x"</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="ss">"x"</span> +<span class="k">WHERE</span> +<span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="ss">"x"</span><span class="p">.</span><span class="ss">"z"</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">DATE</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">CAST</span><span class="p">(</span><span class="s1">'2021-02-01'</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="nb">DATE</span><span class="p">)</span> +</code></pre> +</div> + +<h3 id="ast-introspection">AST Introspection</h3> + +<p>You can see the AST version of the sql by calling <code>repr</code>:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">parse_one</span> +<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT a + 1 AS z"</span><span class="p">)))</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="p">(</span><span class="n">SELECT</span> <span class="n">expressions</span><span class="p">:</span> + <span class="p">(</span><span class="n">ALIAS</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">ADD</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)),</span> <span class="n">expression</span><span class="p">:</span> + <span class="p">(</span><span class="n">LITERAL</span> <span class="n">this</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="n">is_string</span><span class="p">:</span> <span class="kc">False</span><span class="p">)),</span> <span class="n">alias</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">z</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)))</span> +</code></pre> +</div> + +<h3 id="ast-diff">AST Diff</h3> + +<p>SQLGlot can calculate the difference between two expressions and output changes in a form of a sequence of actions needed to transform a source expression into a target one:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">diff</span><span class="p">,</span> <span class="n">parse_one</span> +<span class="n">diff</span><span class="p">(</span><span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT a + b, c, d"</span><span class="p">),</span> <span class="n">parse_one</span><span class="p">(</span><span class="s2">"SELECT c, a - b, d"</span><span class="p">))</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="p">[</span> + <span class="n">Remove</span><span class="p">(</span><span class="n">expression</span><span class="o">=</span><span class="p">(</span><span class="n">ADD</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)),</span> <span class="n">expression</span><span class="p">:</span> + <span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">b</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)))),</span> + <span class="n">Insert</span><span class="p">(</span><span class="n">expression</span><span class="o">=</span><span class="p">(</span><span class="n">SUB</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)),</span> <span class="n">expression</span><span class="p">:</span> + <span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">b</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)))),</span> + <span class="n">Move</span><span class="p">(</span><span class="n">expression</span><span class="o">=</span><span class="p">(</span><span class="n">COLUMN</span> <span class="n">this</span><span class="p">:</span> + <span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">c</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">))),</span> + <span class="n">Keep</span><span class="p">(</span><span class="n">source</span><span class="o">=</span><span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">b</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">),</span> <span class="n">target</span><span class="o">=</span><span class="p">(</span><span class="n">IDENTIFIER</span> <span class="n">this</span><span class="p">:</span> <span class="n">b</span><span class="p">,</span> <span class="n">quoted</span><span class="p">:</span> <span class="kc">False</span><span class="p">)),</span> + <span class="o">...</span> +<span class="p">]</span> +</code></pre> +</div> + +<p>See also: <a href="https://github.com/tobymao/sqlglot/blob/main/posts/sql_diff.md">Semantic Diff for SQL</a>.</p> + +<h3 id="custom-dialects">Custom Dialects</h3> + +<p><a href="https://github.com/tobymao/sqlglot/tree/main/sqlglot/dialects">Dialects</a> can be added by subclassing <code>Dialect</code>:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">exp</span> +<span class="kn">from</span> <span class="nn"><a href="sqlglot/dialects/dialect.html">sqlglot.dialects.dialect</a></span> <span class="kn">import</span> <span class="n">Dialect</span> +<span class="kn">from</span> <span class="nn"><a href="sqlglot/generator.html">sqlglot.generator</a></span> <span class="kn">import</span> <span class="n">Generator</span> +<span class="kn">from</span> <span class="nn"><a href="sqlglot/tokens.html">sqlglot.tokens</a></span> <span class="kn">import</span> <span class="n">Tokenizer</span><span class="p">,</span> <span class="n">TokenType</span> + + +<span class="k">class</span> <span class="nc">Custom</span><span class="p">(</span><span class="n">Dialect</span><span class="p">):</span> + <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">Tokenizer</span><span class="p">):</span> + <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span> + <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span> + + <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span> + <span class="o">**</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span> + <span class="s2">"INT64"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">BIGINT</span><span class="p">,</span> + <span class="s2">"FLOAT64"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">,</span> + <span class="p">}</span> + + <span class="k">class</span> <span class="nc">Generator</span><span class="p">(</span><span class="n">Generator</span><span class="p">):</span> + <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span><span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">]"</span><span class="p">}</span> + + <span class="n">TYPE_MAPPING</span> <span class="o">=</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">TINYINT</span><span class="p">:</span> <span class="s2">"INT64"</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">SMALLINT</span><span class="p">:</span> <span class="s2">"INT64"</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">INT</span><span class="p">:</span> <span class="s2">"INT64"</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">BIGINT</span><span class="p">:</span> <span class="s2">"INT64"</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">DECIMAL</span><span class="p">:</span> <span class="s2">"NUMERIC"</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">FLOAT</span><span class="p">:</span> <span class="s2">"FLOAT64"</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">DOUBLE</span><span class="p">:</span> <span class="s2">"FLOAT64"</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">BOOLEAN</span><span class="p">:</span> <span class="s2">"BOOL"</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">TEXT</span><span class="p">:</span> <span class="s2">"STRING"</span><span class="p">,</span> + <span class="p">}</span> + +<span class="nb">print</span><span class="p">(</span><span class="n">Dialect</span><span class="p">[</span><span class="s2">"custom"</span><span class="p">])</span> +</code></pre> +</div> + +<pre><code><class '__main__.Custom'> +</code></pre> + +<h3 id="sql-execution">SQL Execution</h3> + +<p>One can even interpret SQL queries using SQLGlot, where the tables are represented as Python dictionaries. Although the engine is not very fast (it's not supposed to be) and is in a relatively early stage of development, it can be useful for unit testing and running SQL natively across Python objects. Additionally, the foundation can be easily integrated with fast compute kernels (arrow, pandas). Below is an example showcasing the execution of a SELECT expression that involves aggregations and JOINs:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="kn">from</span> <span class="nn"><a href="sqlglot/executor.html">sqlglot.executor</a></span> <span class="kn">import</span> <span class="n">execute</span> + +<span class="n">tables</span> <span class="o">=</span> <span class="p">{</span> + <span class="s2">"sushi"</span><span class="p">:</span> <span class="p">[</span> + <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"price"</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">"price"</span><span class="p">:</span> <span class="mf">2.0</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"price"</span><span class="p">:</span> <span class="mf">3.0</span><span class="p">},</span> + <span class="p">],</span> + <span class="s2">"order_items"</span><span class="p">:</span> <span class="p">[</span> + <span class="p">{</span><span class="s2">"sushi_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"order_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"sushi_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"order_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"sushi_id"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">"order_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"sushi_id"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"order_id"</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span> + <span class="p">],</span> + <span class="s2">"orders"</span><span class="p">:</span> <span class="p">[</span> + <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"user_id"</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> + <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">"user_id"</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span> + <span class="p">],</span> +<span class="p">}</span> + +<span class="n">execute</span><span class="p">(</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> SELECT</span> +<span class="sd"> o.user_id,</span> +<span class="sd"> SUM(s.price) AS price</span> +<span class="sd"> FROM orders o</span> +<span class="sd"> JOIN order_items i</span> +<span class="sd"> ON o.id = i.order_id</span> +<span class="sd"> JOIN sushi s</span> +<span class="sd"> ON i.sushi_id = s.id</span> +<span class="sd"> GROUP BY o.user_id</span> +<span class="sd"> """</span><span class="p">,</span> + <span class="n">tables</span><span class="o">=</span><span class="n">tables</span> +<span class="p">)</span> +</code></pre> +</div> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="n">user_id</span> <span class="n">price</span> + <span class="mi">1</span> <span class="mf">4.0</span> + <span class="mi">2</span> <span class="mf">3.0</span> +</code></pre> +</div> + +<p>See also: <a href="https://github.com/tobymao/sqlglot/blob/main/posts/python_sql_engine.md">Writing a Python SQL engine from scratch</a>.</p> + +<h2 id="used-by">Used By</h2> + +<ul> +<li><a href="https://github.com/fugue-project/fugue">Fugue</a></li> +<li><a href="https://github.com/ibis-project/ibis">ibis</a></li> +<li><a href="https://github.com/kelsin/mysql-mimic">mysql-mimic</a></li> +<li><a href="https://github.com/pinterest/querybook">Querybook</a></li> +<li><a href="https://github.com/marsupialtail/quokka">Quokka</a></li> +<li><a href="https://github.com/moj-analytical-services/splink">Splink</a></li> +</ul> + +<h2 id="documentation">Documentation</h2> + +<p>SQLGlot uses <a href="https://pdoc.dev/">pdoc</a> to serve its API documentation:</p> + +<pre><code>make docs-serve +</code></pre> + +<h2 id="run-tests-and-lint">Run Tests and Lint</h2> + +<pre><code>make check # Set SKIP_INTEGRATION=1 to skip integration tests +</code></pre> + +<h2 id="benchmarks">Benchmarks</h2> + +<p><a href="https://github.com/tobymao/sqlglot/blob/main/benchmarks/bench.py">Benchmarks</a> run on Python 3.10.5 in seconds.</p> + +<table> +<thead> +<tr> + <th>Query</th> + <th>sqlglot</th> + <th>sqlfluff</th> + <th>sqltree</th> + <th>sqlparse</th> + <th>moz_sql_parser</th> + <th>sqloxide</th> +</tr> +</thead> +<tbody> +<tr> + <td>tpch</td> + <td>0.01308 (1.0)</td> + <td>1.60626 (122.7)</td> + <td>0.01168 (0.893)</td> + <td>0.04958 (3.791)</td> + <td>0.08543 (6.531)</td> + <td>0.00136 (0.104)</td> +</tr> +<tr> + <td>short</td> + <td>0.00109 (1.0)</td> + <td>0.14134 (129.2)</td> + <td>0.00099 (0.906)</td> + <td>0.00342 (3.131)</td> + <td>0.00652 (5.970)</td> + <td>8.76E-5 (0.080)</td> +</tr> +<tr> + <td>long</td> + <td>0.01399 (1.0)</td> + <td>2.12632 (151.9)</td> + <td>0.01126 (0.805)</td> + <td>0.04410 (3.151)</td> + <td>0.06671 (4.767)</td> + <td>0.00107 (0.076)</td> +</tr> +<tr> + <td>crazy</td> + <td>0.03969 (1.0)</td> + <td>24.3777 (614.1)</td> + <td>0.03917 (0.987)</td> + <td>11.7043 (294.8)</td> + <td>1.03280 (26.02)</td> + <td>0.00625 (0.157)</td> +</tr> +</tbody> +</table> + +<h2 id="optional-dependencies">Optional Dependencies</h2> + +<p>SQLGlot uses <a href="https://github.com/dateutil/dateutil">dateutil</a> to simplify literal timedelta expressions. The optimizer will not simplify expressions like the following if the module cannot be found:</p> + +<div class="pdoc-code codehilite"> +<pre><span></span><code><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nb">interval</span><span class="w"> </span><span class="s1">'1'</span><span class="w"> </span><span class="k">month</span> +</code></pre> +</div> + +<hr /> +</div> + + <input id="mod-sqlglot-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1"> + + <label class="view-source-button" for="mod-sqlglot-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="sd">"""</span> +</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a><span class="sd">.. include:: ../README.md</span> +</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a> +</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a><span class="sd">----</span> +</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="sd">"""</span> +</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a> +</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</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 class="kn">import</span> <span class="nn">typing</span> <span class="k">as</span> <span class="nn">t</span> +</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a> +</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span> <span class="nn">sqlglot</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-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects</span> <span class="kn">import</span> <span class="n">Dialect</span><span class="p">,</span> <span class="n">Dialects</span> +</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="kn">from</span> <span class="nn">sqlglot.diff</span> <span class="kn">import</span> <span class="n">diff</span> +</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="kn">from</span> <span class="nn">sqlglot.errors</span> <span class="kn">import</span> <span class="n">ErrorLevel</span><span class="p">,</span> <span class="n">ParseError</span><span class="p">,</span> <span class="n">TokenError</span><span class="p">,</span> <span class="n">UnsupportedError</span> +</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">from</span> <span class="nn">sqlglot.expressions</span> <span class="kn">import</span> <span class="n">Expression</span> +</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="kn">from</span> <span class="nn">sqlglot.expressions</span> <span class="kn">import</span> <span class="n">alias_</span> <span class="k">as</span> <span class="n">alias</span> +</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">sqlglot.expressions</span> <span class="kn">import</span> <span class="p">(</span> +</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a> <span class="n">and_</span><span class="p">,</span> +</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a> <span class="n">column</span><span class="p">,</span> +</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a> <span class="n">condition</span><span class="p">,</span> +</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a> <span class="n">except_</span><span class="p">,</span> +</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="n">from_</span><span class="p">,</span> +</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a> <span class="n">intersect</span><span class="p">,</span> +</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a> <span class="n">maybe_parse</span><span class="p">,</span> +</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a> <span class="n">not_</span><span class="p">,</span> +</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="n">or_</span><span class="p">,</span> +</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="n">select</span><span class="p">,</span> +</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">subquery</span><span class="p">,</span> +</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="p">)</span> +</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="kn">from</span> <span class="nn">sqlglot.expressions</span> <span class="kn">import</span> <span class="n">table_</span> <span class="k">as</span> <span class="n">table</span> +</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="kn">from</span> <span class="nn">sqlglot.expressions</span> <span class="kn">import</span> <span class="n">to_column</span><span class="p">,</span> <span class="n">to_table</span><span class="p">,</span> <span class="n">union</span> +</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="kn">from</span> <span class="nn">sqlglot.generator</span> <span class="kn">import</span> <span class="n">Generator</span> +</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="kn">from</span> <span class="nn">sqlglot.parser</span> <span class="kn">import</span> <span class="n">Parser</span> +</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">MappingSchema</span><span class="p">,</span> <span class="n">Schema</span> +</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a><span class="kn">from</span> <span class="nn">sqlglot.tokens</span> <span class="kn">import</span> <span class="n">Tokenizer</span><span class="p">,</span> <span class="n">TokenType</span> +</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> +</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a><span class="k">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-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">DialectType</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">T</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeVar</span><span class="p">(</span><span class="s2">"T"</span><span class="p">,</span> <span class="n">bound</span><span class="o">=</span><span class="n">Expression</span><span class="p">)</span> +</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> +</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> +</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="s2">"11.0.0"</span> +</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> +</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a><span class="n">pretty</span> <span class="o">=</span> <span class="kc">False</span> +</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="sd">"""Whether to format generated SQL by default."""</span> +</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> +</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="n">schema</span> <span class="o">=</span> <span class="n">MappingSchema</span><span class="p">()</span> +</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a><span class="sd">"""The default schema used by SQLGlot (e.g. in the optimizer)."""</span> +</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> +</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> +</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Expression</span><span class="p">]]:</span> +</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="w"> </span><span class="sd">"""</span> +</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a><span class="sd"> Parses the given SQL string into a collection of syntax trees, one per parsed SQL statement.</span> +</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> +</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a><span class="sd"> Args:</span> +</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a><span class="sd"> sql: the SQL code string to parse.</span> +</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="sd"> read: the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a><span class="sd"> **opts: other `sqlglot.parser.Parser` options.</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="sd"> Returns:</span> +</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> The resulting syntax tree collection.</span> +</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> """</span> +</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">dialect</span> <span class="o">=</span> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">read</span><span class="p">)()</span> +</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="k">return</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> +</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> +</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span> +</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="n">read</span><span class="p">:</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">T</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> +</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="o">**</span><span class="n">opts</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 class="o">-></span> <span class="n">T</span><span class="p">:</span> +</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="o">...</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><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span> +</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span><span class="p">,</span> +</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">T</span><span class="p">],</span> +</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">T</span><span class="p">:</span> +</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="o">...</span> +</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> +</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> +</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span> +</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">read</span><span class="p">:</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">Expression</span><span class="p">]]]]</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> +</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">Expression</span><span class="p">:</span> +</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="o">...</span> +</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> +</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> +</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span> +</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span><span class="p">,</span> +</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Type</span><span class="p">[</span><span class="n">Expression</span><span class="p">]]]],</span> +</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">Expression</span><span class="p">:</span> +</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="o">...</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><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="nd">@t</span><span class="o">.</span><span class="n">overload</span> +</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">Expression</span><span class="p">:</span> +</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="o">...</span> +</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> +</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> +</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">IntoType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="p">)</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">"""</span> +</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd"> Parses the given SQL string and returns a syntax tree for the first parsed SQL statement.</span> +</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> +</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd"> Args:</span> +</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd"> sql: the SQL code string to parse.</span> +</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a><span class="sd"> read: the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="sd"> into: the SQLGlot Expression to parse into.</span> +</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a><span class="sd"> **opts: other `sqlglot.parser.Parser` options.</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="sd"> Returns:</span> +</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd"> The syntax tree for the first parsed statement.</span> +</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a><span class="sd"> """</span> +</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> +</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">dialect</span> <span class="o">=</span> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">read</span><span class="p">)()</span> +</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> +</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">if</span> <span class="n">into</span><span class="p">:</span> +</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse_into</span><span class="p">(</span><span class="n">into</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">else</span><span class="p">:</span> +</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> +</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span> +</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">expression</span><span class="p">:</span> +</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No expression was parsed from '</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span> +</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">return</span> <span class="n">expression</span> +</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">else</span><span class="p">:</span> +</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No expression was parsed from '</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span> +</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> +</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> +</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="k">def</span> <span class="nf">transpile</span><span class="p">(</span> +</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">write</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="n">identity</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-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">error_level</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">ErrorLevel</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span> +</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a><span class="w"> </span><span class="sd">"""</span> +</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a><span class="sd"> Parses the given SQL string in accordance with the source dialect and returns a list of SQL strings transformed</span> +</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a><span class="sd"> to conform to the target dialect. Each string in the returned list represents a single transformed SQL statement.</span> +</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> +</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="sd"> Args:</span> +</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="sd"> sql: the SQL code string to transpile.</span> +</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="sd"> read: the source dialect used to parse the input string (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="sd"> write: the target dialect into which the input should be transformed (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a><span class="sd"> identity: if set to `True` and if the target dialect is not specified the source dialect will be used as both:</span> +</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="sd"> the source and the target dialect.</span> +</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a><span class="sd"> error_level: the desired error level of the parser.</span> +</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a><span class="sd"> **opts: other `sqlglot.generator.Generator` options.</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"> Returns:</span> +</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a><span class="sd"> The list of transpiled SQL statements.</span> +</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a><span class="sd"> """</span> +</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="n">write</span> <span class="o">=</span> <span class="n">write</span> <span class="ow">or</span> <span class="n">read</span> <span class="k">if</span> <span class="n">identity</span> <span class="k">else</span> <span class="n">write</span> +</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">return</span> <span class="p">[</span> +</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">write</span><span class="p">)()</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">read</span><span class="p">,</span> <span class="n">error_level</span><span class="o">=</span><span class="n">error_level</span><span class="p">)</span> +</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="p">]</span> +</span></pre></div> + + + </section> + <section id="pretty"> + <div class="attr variable"> + <span class="name">pretty</span><span class="default_value"> = False</span> + + + </div> + <a class="headerlink" href="#pretty"></a> + + <div class="docstring"><p>Whether to format generated SQL by default.</p> +</div> + + + </section> + <section id="schema"> + <div class="attr variable"> + <span class="name">schema</span><span class="default_value"> = <<a href="sqlglot/schema.html#MappingSchema">sqlglot.schema.MappingSchema</a> object></span> + + + </div> + <a class="headerlink" href="#schema"></a> + + <div class="docstring"><p>The default schema used by SQLGlot (e.g. in the optimizer).</p> +</div> + + + </section> + <section id="parse"> + <input id="parse-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">parse</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">read</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="o">**</span><span class="n">opts</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n">Optional</span><span class="p">[</span><span class="n"><a href="sqlglot/expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span>:</span></span> + + <label class="view-source-button" for="parse-view-source"><span>View Source</span></label> + + </div> + <a class="headerlink" href="#parse"></a> + <div class="pdoc-code codehilite"><pre><span></span><span id="parse-53"><a href="#parse-53"><span class="linenos">53</span></a><span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Expression</span><span class="p">]]:</span> +</span><span id="parse-54"><a href="#parse-54"><span class="linenos">54</span></a><span class="w"> </span><span class="sd">"""</span> +</span><span id="parse-55"><a href="#parse-55"><span class="linenos">55</span></a><span class="sd"> Parses the given SQL string into a collection of syntax trees, one per parsed SQL statement.</span> +</span><span id="parse-56"><a href="#parse-56"><span class="linenos">56</span></a> +</span><span id="parse-57"><a href="#parse-57"><span class="linenos">57</span></a><span class="sd"> Args:</span> +</span><span id="parse-58"><a href="#parse-58"><span class="linenos">58</span></a><span class="sd"> sql: the SQL code string to parse.</span> +</span><span id="parse-59"><a href="#parse-59"><span class="linenos">59</span></a><span class="sd"> read: the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="parse-60"><a href="#parse-60"><span class="linenos">60</span></a><span class="sd"> **opts: other `sqlglot.parser.Parser` options.</span> +</span><span id="parse-61"><a href="#parse-61"><span class="linenos">61</span></a> +</span><span id="parse-62"><a href="#parse-62"><span class="linenos">62</span></a><span class="sd"> Returns:</span> +</span><span id="parse-63"><a href="#parse-63"><span class="linenos">63</span></a><span class="sd"> The resulting syntax tree collection.</span> +</span><span id="parse-64"><a href="#parse-64"><span class="linenos">64</span></a><span class="sd"> """</span> +</span><span id="parse-65"><a href="#parse-65"><span class="linenos">65</span></a> <span class="n">dialect</span> <span class="o">=</span> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">read</span><span class="p">)()</span> +</span><span id="parse-66"><a href="#parse-66"><span class="linenos">66</span></a> <span class="k">return</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span></pre></div> + + + <div class="docstring"><p>Parses the given SQL string into a collection of syntax trees, one per parsed SQL statement.</p> + +<h6 id="arguments">Arguments:</h6> + +<ul> +<li><strong>sql:</strong> the SQL code string to parse.</li> +<li><strong>read:</strong> the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</li> +<li><strong>**opts:</strong> other <code><a href="sqlglot/parser.html#Parser">sqlglot.parser.Parser</a></code> options.</li> +</ul> + +<h6 id="returns">Returns:</h6> + +<blockquote> + <p>The resulting syntax tree collection.</p> +</blockquote> +</div> + + + </section> + <section id="parse_one"> + <input id="parse_one-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">parse_one</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">read</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">into</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">],</span> <span class="n">Collection</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="o">**</span><span class="n">opts</span></span><span class="return-annotation">) -> <span class="n"><a href="sqlglot/expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span> + + <label class="view-source-button" for="parse_one-view-source"><span>View Source</span></label> + + </div> + <a class="headerlink" href="#parse_one"></a> + <div class="pdoc-code codehilite"><pre><span></span><span id="parse_one-117"><a href="#parse_one-117"><span class="linenos">117</span></a><span class="k">def</span> <span class="nf">parse_one</span><span class="p">(</span> +</span><span id="parse_one-118"><a href="#parse_one-118"><span class="linenos">118</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="parse_one-119"><a href="#parse_one-119"><span class="linenos">119</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="parse_one-120"><a href="#parse_one-120"><span class="linenos">120</span></a> <span class="n">into</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">IntoType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="parse_one-121"><a href="#parse_one-121"><span class="linenos">121</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="parse_one-122"><a href="#parse_one-122"><span class="linenos">122</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">Expression</span><span class="p">:</span> +</span><span id="parse_one-123"><a href="#parse_one-123"><span class="linenos">123</span></a><span class="w"> </span><span class="sd">"""</span> +</span><span id="parse_one-124"><a href="#parse_one-124"><span class="linenos">124</span></a><span class="sd"> Parses the given SQL string and returns a syntax tree for the first parsed SQL statement.</span> +</span><span id="parse_one-125"><a href="#parse_one-125"><span class="linenos">125</span></a> +</span><span id="parse_one-126"><a href="#parse_one-126"><span class="linenos">126</span></a><span class="sd"> Args:</span> +</span><span id="parse_one-127"><a href="#parse_one-127"><span class="linenos">127</span></a><span class="sd"> sql: the SQL code string to parse.</span> +</span><span id="parse_one-128"><a href="#parse_one-128"><span class="linenos">128</span></a><span class="sd"> read: the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="parse_one-129"><a href="#parse_one-129"><span class="linenos">129</span></a><span class="sd"> into: the SQLGlot Expression to parse into.</span> +</span><span id="parse_one-130"><a href="#parse_one-130"><span class="linenos">130</span></a><span class="sd"> **opts: other `sqlglot.parser.Parser` options.</span> +</span><span id="parse_one-131"><a href="#parse_one-131"><span class="linenos">131</span></a> +</span><span id="parse_one-132"><a href="#parse_one-132"><span class="linenos">132</span></a><span class="sd"> Returns:</span> +</span><span id="parse_one-133"><a href="#parse_one-133"><span class="linenos">133</span></a><span class="sd"> The syntax tree for the first parsed statement.</span> +</span><span id="parse_one-134"><a href="#parse_one-134"><span class="linenos">134</span></a><span class="sd"> """</span> +</span><span id="parse_one-135"><a href="#parse_one-135"><span class="linenos">135</span></a> +</span><span id="parse_one-136"><a href="#parse_one-136"><span class="linenos">136</span></a> <span class="n">dialect</span> <span class="o">=</span> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">read</span><span class="p">)()</span> +</span><span id="parse_one-137"><a href="#parse_one-137"><span class="linenos">137</span></a> +</span><span id="parse_one-138"><a href="#parse_one-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="n">into</span><span class="p">:</span> +</span><span id="parse_one-139"><a href="#parse_one-139"><span class="linenos">139</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse_into</span><span class="p">(</span><span class="n">into</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="parse_one-140"><a href="#parse_one-140"><span class="linenos">140</span></a> <span class="k">else</span><span class="p">:</span> +</span><span id="parse_one-141"><a href="#parse_one-141"><span class="linenos">141</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">dialect</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="parse_one-142"><a href="#parse_one-142"><span class="linenos">142</span></a> +</span><span id="parse_one-143"><a href="#parse_one-143"><span class="linenos">143</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span> +</span><span id="parse_one-144"><a href="#parse_one-144"><span class="linenos">144</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">expression</span><span class="p">:</span> +</span><span id="parse_one-145"><a href="#parse_one-145"><span class="linenos">145</span></a> <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No expression was parsed from '</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span> +</span><span id="parse_one-146"><a href="#parse_one-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="n">expression</span> +</span><span id="parse_one-147"><a href="#parse_one-147"><span class="linenos">147</span></a> <span class="k">else</span><span class="p">:</span> +</span><span id="parse_one-148"><a href="#parse_one-148"><span class="linenos">148</span></a> <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No expression was parsed from '</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">'"</span><span class="p">)</span> +</span></pre></div> + + + <div class="docstring"><p>Parses the given SQL string and returns a syntax tree for the first parsed SQL statement.</p> + +<h6 id="arguments">Arguments:</h6> + +<ul> +<li><strong>sql:</strong> the SQL code string to parse.</li> +<li><strong>read:</strong> the SQL dialect to apply during parsing (eg. "spark", "hive", "presto", "mysql").</li> +<li><strong>into:</strong> the SQLGlot Expression to parse into.</li> +<li><strong>**opts:</strong> other <code><a href="sqlglot/parser.html#Parser">sqlglot.parser.Parser</a></code> options.</li> +</ul> + +<h6 id="returns">Returns:</h6> + +<blockquote> + <p>The syntax tree for the first parsed statement.</p> +</blockquote> +</div> + + + </section> + <section id="transpile"> + <input id="transpile-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">transpile</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">read</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">write</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="sqlglot/dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">identity</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="n">error_level</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n"><a href="sqlglot/errors.html#ErrorLevel">sqlglot.errors.ErrorLevel</a></span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="o">**</span><span class="n">opts</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span> + + <label class="view-source-button" for="transpile-view-source"><span>View Source</span></label> + + </div> + <a class="headerlink" href="#transpile"></a> + <div class="pdoc-code codehilite"><pre><span></span><span id="transpile-151"><a href="#transpile-151"><span class="linenos">151</span></a><span class="k">def</span> <span class="nf">transpile</span><span class="p">(</span> +</span><span id="transpile-152"><a href="#transpile-152"><span class="linenos">152</span></a> <span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> +</span><span id="transpile-153"><a href="#transpile-153"><span class="linenos">153</span></a> <span class="n">read</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="transpile-154"><a href="#transpile-154"><span class="linenos">154</span></a> <span class="n">write</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="transpile-155"><a href="#transpile-155"><span class="linenos">155</span></a> <span class="n">identity</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="transpile-156"><a href="#transpile-156"><span class="linenos">156</span></a> <span class="n">error_level</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">ErrorLevel</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> +</span><span id="transpile-157"><a href="#transpile-157"><span class="linenos">157</span></a> <span class="o">**</span><span class="n">opts</span><span class="p">,</span> +</span><span id="transpile-158"><a href="#transpile-158"><span class="linenos">158</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span> +</span><span id="transpile-159"><a href="#transpile-159"><span class="linenos">159</span></a><span class="w"> </span><span class="sd">"""</span> +</span><span id="transpile-160"><a href="#transpile-160"><span class="linenos">160</span></a><span class="sd"> Parses the given SQL string in accordance with the source dialect and returns a list of SQL strings transformed</span> +</span><span id="transpile-161"><a href="#transpile-161"><span class="linenos">161</span></a><span class="sd"> to conform to the target dialect. Each string in the returned list represents a single transformed SQL statement.</span> +</span><span id="transpile-162"><a href="#transpile-162"><span class="linenos">162</span></a> +</span><span id="transpile-163"><a href="#transpile-163"><span class="linenos">163</span></a><span class="sd"> Args:</span> +</span><span id="transpile-164"><a href="#transpile-164"><span class="linenos">164</span></a><span class="sd"> sql: the SQL code string to transpile.</span> +</span><span id="transpile-165"><a href="#transpile-165"><span class="linenos">165</span></a><span class="sd"> read: the source dialect used to parse the input string (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="transpile-166"><a href="#transpile-166"><span class="linenos">166</span></a><span class="sd"> write: the target dialect into which the input should be transformed (eg. "spark", "hive", "presto", "mysql").</span> +</span><span id="transpile-167"><a href="#transpile-167"><span class="linenos">167</span></a><span class="sd"> identity: if set to `True` and if the target dialect is not specified the source dialect will be used as both:</span> +</span><span id="transpile-168"><a href="#transpile-168"><span class="linenos">168</span></a><span class="sd"> the source and the target dialect.</span> +</span><span id="transpile-169"><a href="#transpile-169"><span class="linenos">169</span></a><span class="sd"> error_level: the desired error level of the parser.</span> +</span><span id="transpile-170"><a href="#transpile-170"><span class="linenos">170</span></a><span class="sd"> **opts: other `sqlglot.generator.Generator` options.</span> +</span><span id="transpile-171"><a href="#transpile-171"><span class="linenos">171</span></a> +</span><span id="transpile-172"><a href="#transpile-172"><span class="linenos">172</span></a><span class="sd"> Returns:</span> +</span><span id="transpile-173"><a href="#transpile-173"><span class="linenos">173</span></a><span class="sd"> The list of transpiled SQL statements.</span> +</span><span id="transpile-174"><a href="#transpile-174"><span class="linenos">174</span></a><span class="sd"> """</span> +</span><span id="transpile-175"><a href="#transpile-175"><span class="linenos">175</span></a> <span class="n">write</span> <span class="o">=</span> <span class="n">write</span> <span class="ow">or</span> <span class="n">read</span> <span class="k">if</span> <span class="n">identity</span> <span class="k">else</span> <span class="n">write</span> +</span><span id="transpile-176"><a href="#transpile-176"><span class="linenos">176</span></a> <span class="k">return</span> <span class="p">[</span> +</span><span id="transpile-177"><a href="#transpile-177"><span class="linenos">177</span></a> <span class="n">Dialect</span><span class="o">.</span><span class="n">get_or_raise</span><span class="p">(</span><span class="n">write</span><span class="p">)()</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="o">**</span><span class="n">opts</span><span class="p">)</span> +</span><span id="transpile-178"><a href="#transpile-178"><span class="linenos">178</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">parse</span><span class="p">(</span><span class="n">sql</span><span class="p">,</span> <span class="n">read</span><span class="p">,</span> <span class="n">error_level</span><span class="o">=</span><span class="n">error_level</span><span class="p">)</span> +</span><span id="transpile-179"><a href="#transpile-179"><span class="linenos">179</span></a> <span class="p">]</span> +</span></pre></div> + + + <div class="docstring"><p>Parses the given SQL string in accordance with the source dialect and returns a list of SQL strings transformed +to conform to the target dialect. Each string in the returned list represents a single transformed SQL statement.</p> + +<h6 id="arguments">Arguments:</h6> + +<ul> +<li><strong>sql:</strong> the SQL code string to transpile.</li> +<li><strong>read:</strong> the source dialect used to parse the input string (eg. "spark", "hive", "presto", "mysql").</li> +<li><strong>write:</strong> the target dialect into which the input should be transformed (eg. "spark", "hive", "presto", "mysql").</li> +<li><strong>identity:</strong> if set to <code>True</code> and if the target dialect is not specified the source dialect will be used as both: +the source and the target dialect.</li> +<li><strong>error_level:</strong> the desired error level of the parser.</li> +<li><strong>**opts:</strong> other <code><a href="sqlglot/generator.html#Generator">sqlglot.generator.Generator</a></code> options.</li> +</ul> + +<h6 id="returns">Returns:</h6> + +<blockquote> + <p>The list of transpiled SQL statements.</p> +</blockquote> +</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>
\ No newline at end of file |