2025-02-13 15:23:26 +01:00
<!doctype html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2025-06-15 10:36:04 +02:00
< meta name = "generator" content = "pdoc 15.0.4" / >
2025-02-13 15:23:26 +01:00
< title > sqlglot.transforms API documentation< / title >
< style > / * ! * B o o t s t r a p R e b o o t v 5 . 0 . 0 ( h t t p s : / / g e t b o o t s t r a p . c o m / ) * C o p y r i g h t 2 0 1 1 - 2 0 2 1 T h e B o o t s t r a p A u t h o r s * C o p y r i g h t 2 0 1 1 - 2 0 2 1 T w i t t e r , I n c . * L i c e n s e d u n d e r M I T ( h t t p s : / / g i t h u b . c o m / t w b s / b o o t s t r a p / b l o b / m a i n / L I C E N S E ) * F o r k e d f r o m N o r m a l i z e . c s s , l i c e n s e d M I T ( h t t p s : / / g i t h u b . c o m / n e c o l a s / n o r m a l i z e . c s s / b l o b / m a s t e r / L I C E N S E . m d ) * / * , : : a f t e r , : : b e f o r e { b o x - s i z i n g : b o r d e r - b o x } @ m e d i a ( p r e f e r s - r e d u c e d - m o t i o n : n o - p r e f e r e n c e ) { : r o o t { s c r o l l - b e h a v i o r : s m o o t h } } b o d y { m a r g i n : 0 ; f o n t - f a m i l y : s y s t e m - u i , - a p p l e - s y s t e m , " S e g o e U I " , R o b o t o , " H e l v e t i c a N e u e " , A r i a l , " N o t o S a n s " , " L i b e r a t i o n S a n s " , s a n s - s e r i f , " A p p l e C o l o r E m o j i " , " S e g o e U I E m o j i " , " S e g o e U I S y m b o l " , " N o t o C o l o r E m o j i " ; f o n t - s i z e : 1 r e m ; f o n t - w e i g h t : 4 0 0 ; l i n e - h e i g h t : 1 . 5 ; c o l o r : # 2 1 2 5 2 9 ; b a c k g r o u n d - c o l o r : # f f f ; - w e b k i t - t e x t - s i z e - a d j u s t : 1 0 0 % ; - w e b k i t - t a p - h i g h l i g h t - c o l o r : t r a n s p a r e n t } h r { m a r g i n : 1 r e m 0 ; c o l o r : i n h e r i t ; b a c k g r o u n d - c o l o r : c u r r e n t C o l o r ; b o r d e r : 0 ; o p a c i t y : . 2 5 } h r : n o t ( [ s i z e ] ) { h e i g h t : 1 p x } h 1 , h 2 , h 3 , h 4 , h 5 , h 6 { m a r g i n - t o p : 0 ; m a r g i n - b o t t o m : . 5 r e m ; f o n t - w e i g h t : 5 0 0 ; l i n e - h e i g h t : 1 . 2 } h 1 { f o n t - s i z e : c a l c ( 1 . 3 7 5 r e m + 1 . 5 v w ) } @ m e d i a ( m i n - w i d t h : 1 2 0 0 p x ) { h 1 { f o n t - s i z e : 2 . 5 r e m } } h 2 { f o n t - s i z e : c a l c ( 1 . 3 2 5 r e m + . 9 v w ) } @ m e d i a ( m i n - w i d t h : 1 2 0 0 p x ) { h 2 { f o n t - s i z e : 2 r e m } } h 3 { f o n t - s i z e : c a l c ( 1 . 3 r e m + . 6 v w ) } @ m e d i a ( m i n - w i d t h : 1 2 0 0 p x ) { h 3 { f o n t - s i z e : 1 . 7 5 r e m } } h 4 { f o n t - s i z e : c a l c ( 1 . 2 7 5 r e m + . 3 v w ) } @ m e d i a ( m i n - w i d t h : 1 2 0 0 p x ) { h 4 { f o n t - s i z e : 1 . 5 r e m } } h 5 { f o n t - s i z e : 1 . 2 5 r e m } h 6 { f o n t - s i z e : 1 r e m } p { m a r g i n - t o p : 0 ; m a r g i n - b o t t o m : 1 r e m } a b b r [ d a t a - b s - o r i g i n a l - t i t l e ] , a b b r [ t i t l e ] { - w e b k i t - t e x t - d e c o r a t i o n : u n d e r l i n e d o t t e d ; t e x t - d e c o r a t i o n : u n d e r l i n e d o t t e d ; c u r s o r : h e l p ; - w e b k i t - t e x t - d e c o r a t i o n - s k i p - i n k : n o n e ; t e x t - d e c o r a t i o n - s k i p - i n k : n o n e } a d d r e s s { m a r g i n - b o t t o m : 1 r e m ; f o n t - s t y l e : n o r m a l ; l i n e - h e i g h t : i n h e r i t } o l , u l { p a d d i n g - l e f t : 2 r e m } d l , o l , u l { m a r g i n - t o p : 0 ; m a r g i n - b o t t o m : 1 r e m } o l o l , o l u l , u l o l , u l u l { m a r g i n - b o t t o m : 0 } d t { f o n t - w e i g h t : 7 0 0 } d d { m a r g i n - b o t t o m : . 5 r e m ; m a r g i n - l e f t : 0 } b l o c k q u o t e { m a r g i n : 0 0 1 r e m } b , s t r o n g { f o n t - w e i g h t : b o l d e r } s m a l l { f o n t - s i z e : . 8 7 5 e m } m a r k { p a d d i n g : . 2 e m ; b a c k g r o u n d - c o l o r : # f c f 8 e 3 } s u b , s u p { p o s i t i o n : r e l a t i v e ; f o n t - s i z e : . 7 5 e m ; l i n e - h e i g h t : 0 ; v e r t i c a l - a l i g n : b a s e l i n e } s u b { b o t t o m : - . 2 5 e m } s u p { t o p : - . 5 e m } a { c o l o r : # 0 d 6 e f d ; t e x t - d e c o r a t i o n : u n d e r l i n e } a : h o v e r { c o l o r : # 0 a 5 8 c a } a : n o t ( [ h r e f ] ) : n o t ( [ c l a s s ] ) , a : n o t ( [ h r e f ] ) : n o t ( [ c l a s s ] ) : h o v e r { c o l o r : i n h e r i t ; t e x t - d e c o r a t i o n : n o n e } c o d e , k b d , p r e , s a m p { f o n t - f a m i l y : S F M o n o - R e g u l a r , M e n l o , M o n a c o , C o n s o l a s , " L i b e r a t i o n M o n o " , " C o u r i e r N e w " , m o n o s p a c e ; f o n t - s i z e : 1 e m ; d i r e c t i o n : l t r ; u n i c o d e - b i d i : b i d i - o v e r r i d e } p r e { d i s p l a y : b l o c k ; m a r g i n - t o p : 0 ; m a r g i n - b o t t o m : 1 r e m ; o v e r f l o w : a u t o ; f o n t - s i z e : . 8 7 5 e m } p r e c o d e { f o n t - s i z e : i n h e r i t ; c o l o r : i n h e r i t ; w o r d - b r e a k : n o r m a l } c o d e { f o n t - s i z e : . 8 7 5 e m ; c o l o r : # d 6 3 3 8 4 ; w o r d - w r a p : b r e a k - w o r d } a > c o d e { c o l o r : i n h e r i t } k b d { p a d d i n g : . 2 r e m . 4 r e m ; f o n t - s i z e : . 8 7 5 e m ; c o l o r : # f f f ; b a c k g r o u n d - c o l o r : # 2 1 2 5 2 9 ; b o r d e r - r a d i u s : . 2 r e m } k b d k b d { p a d d i n g : 0 ; f o n t - s i z e : 1 e m ; f o n t - w e i g h t : 7 0 0 } f i g u r e { m a r g i n : 0 0 1 r e m } i m g , s v g { v e r t i c a l - a l i g n : m i d d l e } t a b l e { c a p t i o n - s i d e : b o t t o m ; b o r d e r - c o l l a p s e : c o l l a p s e } c a p t i o n { p a d d i n g - t o p : . 5 r e m ; p a d d i n g - b o t t o m : . 5 r e m ; c o l o r : # 6 c 7 5 7 d ; t e x t - a l i g n : l e f t } t h { t e x t - a l i g n : i n h e r i t ; t e x t - a l i g n : - w e b k i t - m a t c h - p a r e n t } t b o d y , t d , t f o o t , t h , t h e a d , t r { b o r d e r - c o l o r : i n h e r i t ; b o r d e r - s t y l e : s o l i d ; b o r d e r - w i d t h : 0 } l a b e l { d i s p l a y : i n l i n e - b l o c k } b u t t o n { b o r d e r - r a d i u s : 0 } b u t t o n : f o c u s : n o t ( : f o c u s - v i s i b l e ) { o u t l i n e : 0 } b u t t o n , i n p u t , o p t g r o u p , s e l e c t , t e x t a r e a { m a r g i n : 0 ; f o n t - f a m i l y : i n h e r i t ; f o n t - s i z e : i n h e r i t ; l i n e - h e i g h t : i n h e r i t } b u t t o n , s e l e c t { t e x t - t r a n s f o r m : n o n e } [ r o l e = b u t t o n ] { c u r s o r : p o i n t e r } s e l e c t { w o r d - w r a p : n o r m a l } s e l e c t : d i s a b l e d { o p a c i t y : 1 } [ l i s t ] : : - w e b k i t - c a l e n d a r - p i c k e r - i n d i c a t o r { d i s p l a y : n o n e } [ t y p e = b u t t o n ] , [ t y p e = r e s e t ] , [ t y p e = s u b m i t ] , b u t t o n { - w e b k i t - a p p e a r a n c e : b u t t o n } [ t y p e = b u t t o n ] : n o t ( : d i s a b l e d ) , [ t y p e = r e s e t ] : n o t ( : d i s a b l e d ) , [ t y p e = s u b m i t ] : n o t ( : d i s a b l e d ) , b u t t o n : n o t ( : d i s a b l e d ) { c u r s o r : p o i n t e r } : : - m o z - f o c u s - i n n e r { p a d d i n g : 0 ; b o r d e r - s t y l e : n o n e } t e x t a r e a { r e s i z e : v e r t i c a l } f i e l d s e t { m i n - w i d t h : 0 ; p a d d i n g : 0 ; m a r g i n : 0 ; b o r d e r : 0 } l e g e n d { f l o a t : l e f t ; w i d t h : 1 0 0 % ; p a d d i n g : 0 ; m a r g i n - b o t t o m : . 5 r e m ; f o n t - s i z e : c a l c ( 1 . 2 7 5 r e m + . 3 v w ) ; l i n e - h e i g h t : i n h e r i t } @ m e d i a ( m i n - w i d t h : 1 2 0 0 p x ) { l e g e n d { f o n t - s i z e : 1 . 5 r e m } } l e g e n d + * { c l e a r : l e f t } : : - w e b k i t - d a t e t i m e - e d i t - d a y - f i e l d , : : - w e b k i t - d a t e t i m e - e d i t - f i e l d s - w r a p p e r , : : - w e b k i t - d a t e t i m e - e d i t - h o u r - f i e l d , : : - w e b k i t - d a t e t i m e - e d i t - m i n u t e , : : - w e b k i t - d a t e t i m e - e d i t - m o n t h - f i e
< style > /*! syntax-highlighting.css */ pre { line-height : 125 % ; } span . linenos { color : inherit ; background-color : transparent ; padding-left : 5 px ; padding-right : 20 px ; } . pdoc-code . hll { background-color : #ffffcc } . pdoc-code { background : #f8f8f8 ; } . pdoc-code . c { color : #3D7B7B ; font-style : italic } . pdoc-code . err { border : 1 px 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 >
2025-02-13 21:01:12 +01:00
< 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 : 50 px ; height : 40 px ; top : 1 rem ; right : 1 rem ; border-color : var ( - - text ) ; color : var ( - - text ) ; display : flex ; opacity : 0.8 ; z-index : 999 ; } # navtoggle : hover { opacity : 1 ; } # togglestate + div { display : none ; } # togglestate : checked + div { display : inherit ; } main , header { padding : 2 rem 3 vw ; } header + main { margin-top : -3 rem ; } . git-button { display : none !important ; } nav input [ type = "search" ] { max-width : 77 % ; } nav input [ type = "search" ] : first-child { margin-top : -6 px ; } nav input [ type = "search" ] : valid ~ * { display : none !important ; } } @ media ( min-width : 770px ) { : root { --sidebar-width : clamp ( 12.5 rem , 28 vw , 22 rem ) ; } nav { position : fixed ; overflow : auto ; height : 100 vh ; width : var ( - - sidebar - width ) ; } main , header { padding : 3 rem 2 rem 3 rem calc ( var ( - - sidebar - width ) + 3 rem ) ; width : calc ( 54 rem + var ( - - sidebar - width ) ) ; max-width : 100 % ; } header + main { margin-top : -4 rem ; } # navtoggle { display : none ; } } # togglestate { position : absolute ; height : 0 ; opacity : 0 ; } nav . pdoc { --pad : clamp ( 0.5 rem , 2 vw , 1.75 rem ) ; --indent : 1.5 rem ; background-color : var ( - - accent ) ; border-right : 1 px solid var ( - - accent2 ) ; box-shadow : 0 0 20 px rgba ( 50 , 50 , 50 , .2 ) inset ; padding : 0 0 0 var ( - - pad ) ; overflow-wrap : anywhere ; scrollbar-width : thin ; scrollbar-color : var ( - - accent2 ) transparent ; z-index : 1 } nav . pdoc :: -webkit-scrollbar { width : .4 rem ; } 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 : 1 rem ; } 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 : 35 vh ; display : block ; margin : 0 auto 1 rem ; transform : translate ( calc ( -.5 * var ( - - pad ) ) , 0 ) ; } nav . pdoc ul { list-style : none ; padding-left : 0 ; } nav . pdoc > div > ul { margin-left : calc ( 0 px - var ( - - pad ) ) ; } nav . pdoc li a { padding : .2 rem 0 .2 rem calc ( var ( - - pad ) + var ( - - indent ) ) ; } nav . pdoc > div > ul > li > a { padding-left : var ( - - pad ) ; } nav . pdoc li { transition : all 100 ms ; } 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.5 rem ; } 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 ) 1 px ; margin-top : 1.5 rem ; padding-top : .5 rem ; } nav . pdoc footer { font-size : small ; } < / style >
2025-04-25 07:27:01 +02:00
< style > / * ! c o n t e n t . c s s * / . p d o c { c o l o r : v a r ( - - t e x t ) ; b o x - s i z i n g : b o r d e r - b o x ; l i n e - h e i g h t : 1 . 5 ; b a c k g r o u n d : n o n e ; } . p d o c . p d o c - b u t t o n { c u r s o r : p o i n t e r ; d i s p l a y : i n l i n e - b l o c k ; b o r d e r : s o l i d b l a c k 1 p x ; b o r d e r - r a d i u s : 2 p x ; f o n t - s i z e : . 7 5 r e m ; p a d d i n g : c a l c ( 0 . 5 e m - 1 p x ) 1 e m ; t r a n s i t i o n : 1 0 0 m s a l l ; } . p d o c . a l e r t { p a d d i n g : 1 r e m 1 r e m 1 r e m c a l c ( 1 . 5 r e m + 2 4 p x ) ; b o r d e r : 1 p x s o l i d t r a n s p a r e n t ; b o r d e r - r a d i u s : . 2 5 r e m ; b a c k g r o u n d - r e p e a t : n o - r e p e a t ; b a c k g r o u n d - p o s i t i o n : . 7 5 r e m c e n t e r ; m a r g i n - b o t t o m : 1 r e m ; } . p d o c . a l e r t > e m { d i s p l a y : n o n e ; } . p d o c . a l e r t > * : l a s t - c h i l d { m a r g i n - b o t t o m : 0 ; } . p d o c . a l e r t . n o t e { c o l o r : # 0 8 4 2 9 8 ; b a c k g r o u n d - c o l o r : # c f e 2 f f ; b o r d e r - c o l o r : # b 6 d 4 f e ; b a c k g r o u n d - i m a g e : u r l ( " d a t a : i m a g e / s v g + x m l , % 3 C s v g % 2 0 x m l n s % 3 D % 2 2 h t t p % 3 A / / w w w . w 3 . o r g / 2 0 0 0 / s v g % 2 2 % 2 0 w i d t h % 3 D % 2 2 2 4 % 2 2 % 2 0 h e i g h t % 3 D % 2 2 2 4 % 2 2 % 2 0 f i l l % 3 D % 2 2 % 2 3 0 8 4 2 9 8 % 2 2 % 2 0 v i e w B o x % 3 D % 2 2 0 % 2 0 0 % 2 0 1 6 % 2 0 1 6 % 2 2 % 3 E % 3 C p a t h % 2 0 d % 3 D % 2 2 M 8 % 2 0 1 6 A 8 % 2 0 8 % 2 0 0 % 2 0 1 % 2 0 0 % 2 0 8 % 2 0 0 a 8 % 2 0 8 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 1 6 z m . 9 3 - 9 . 4 1 2 - 1 % 2 0 4 . 7 0 5 c - . 0 7 . 3 4 . 0 2 9 . 5 3 3 . 3 0 4 . 5 3 3 . 1 9 4 % 2 0 0 % 2 0 . 4 8 7 - . 0 7 . 6 8 6 - . 2 4 6 l - . 0 8 8 . 4 1 6 c - . 2 8 7 . 3 4 6 - . 9 2 . 5 9 8 - 1 . 4 6 5 . 5 9 8 - . 7 0 3 % 2 0 0 - 1 . 0 0 2 - . 4 2 2 - . 8 0 8 - 1 . 3 1 9 l . 7 3 8 - 3 . 4 6 8 c . 0 6 4 - . 2 9 3 . 0 0 6 - . 3 9 9 - . 2 8 7 - . 4 7 l - . 4 5 1 - . 0 8 1 . 0 8 2 - . 3 8 1 % 2 0 2 . 2 9 - . 2 8 7 z M 8 % 2 0 5 . 5 a 1 % 2 0 1 % 2 0 0 % 2 0 1 % 2 0 1 % 2 0 0 - 2 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 % 2 0 2 z % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . a l e r t . t i p { c o l o r : # 0 a 3 6 2 2 ; b a c k g r o u n d - c o l o r : # d 1 e 7 d d ; b o r d e r - c o l o r : # a 3 c f b b ; b a c k g r o u n d - i m a g e : u r l ( " d a t a : i m a g e / s v g + x m l , % 3 C s v g % 2 0 x m l n s % 3 D % 2 2 h t t p % 3 A / / w w w . w 3 . o r g / 2 0 0 0 / s v g % 2 2 % 2 0 w i d t h % 3 D % 2 2 2 4 % 2 2 % 2 0 h e i g h t % 3 D % 2 2 2 4 % 2 2 % 2 0 f i l l % 3 D % 2 2 % 2 3 0 a 3 6 2 2 % 2 2 % 2 0 v i e w B o x % 3 D % 2 2 0 % 2 0 0 % 2 0 1 6 % 2 0 1 6 % 2 2 % 3 E % 3 C p a t h % 2 0 d % 3 D % 2 2 M 2 % 2 0 6 a 6 % 2 0 6 % 2 0 0 % 2 0 1 % 2 0 1 % 2 0 1 0 . 1 7 4 % 2 0 4 . 3 1 c - . 2 0 3 . 1 9 6 - . 3 5 9 . 4 - . 4 5 3 . 6 1 9 l - . 7 6 2 % 2 0 1 . 7 6 9 A . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 1 0 . 5 % 2 0 1 3 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 % 2 0 1 % 2 0 . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 % 2 0 1 l - . 2 2 4 . 4 4 7 a 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 - . 8 9 4 . 5 5 3 H 6 . 6 1 8 a 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 - . 8 9 4 - . 5 5 3 L 5 . 5 % 2 0 1 5 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 - 1 % 2 0 . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 - 1 % 2 0 . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 - . 4 6 - . 3 0 2 l - . 7 6 1 - 1 . 7 7 a 2 % 2 0 2 % 2 0 0 % 2 0 0 % 2 0 0 - . 4 5 3 - . 6 1 8 A 5 . 9 8 % 2 0 5 . 9 8 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 2 % 2 0 6 m 6 - 5 a 5 % 2 0 5 % 2 0 0 % 2 0 0 % 2 0 0 - 3 . 4 7 9 % 2 0 8 . 5 9 2 c . 2 6 3 . 2 5 4 . 5 1 4 . 5 6 4 . 6 7 6 . 9 4 1 L 5 . 8 3 % 2 0 1 2 h 4 . 3 4 2 l . 6 3 2 - 1 . 4 6 7 c . 1 6 2 - . 3 7 7 . 4 1 3 - . 6 8 7 . 6 7 6 - . 9 4 1 A 5 % 2 0 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 8 % 2 0 1 % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . a l e r t . i m p o r t a n t { c o l o r : # 0 5 5 1 6 0 ; b a c k g r o u n d - c o l o r : # c f f 4 f c ; b o r d e r - c o l o r : # 9 e e a f 9 ; b a c k g r o u n d - i m a g e : u r l ( " d a t a : i m a g e / s v g + x m l , % 3 C s v g % 2 0 x m l n s % 3 D % 2 2 h t t p % 3 A / / w w w . w 3 . o r g / 2 0 0 0 / s v g % 2 2 % 2 0 w i d t h % 3 D % 2 2 2 4 % 2 2 % 2 0 h e i g h t % 3 D % 2 2 2 4 % 2 2 % 2 0 f i l l % 3 D % 2 2 % 2 3 0 5 5 1 6 0 % 2 2 % 2 0 v i e w B o x % 3 D % 2 2 0 % 2 0 0 % 2 0 1 6 % 2 0 1 6 % 2 2 % 3 E % 3 C p a t h % 2 0 d % 3 D % 2 2 M 2 % 2 0 0 a 2 % 2 0 2 % 2 0 0 % 2 0 0 % 2 0 0 - 2 % 2 0 2 v 1 2 a 2 % 2 0 2 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 2 % 2 0 2 h 1 2 a 2 % 2 0 2 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 2 - 2 V 2 a 2 % 2 0 2 % 2 0 0 % 2 0 0 % 2 0 0 - 2 - 2 z m 6 % 2 0 4 c . 5 3 5 % 2 0 0 % 2 0 . 9 5 4 . 4 6 2 . 9 . 9 9 5 l - . 3 5 % 2 0 3 . 5 0 7 a . 5 5 2 . 5 5 2 % 2 0 0 % 2 0 0 % 2 0 1 - 1 . 1 % 2 0 0 L 7 . 1 % 2 0 4 . 9 9 5 A . 9 0 5 . 9 0 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 8 % 2 0 4 m . 0 0 2 % 2 0 6 a 1 % 2 0 1 % 2 0 0 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 2 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 - 2 % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . a l e r t . w a r n i n g { c o l o r : # 6 6 4 d 0 3 ; b a c k g r o u n d - c o l o r : # f f f 3 c d ; b o r d e r - c o l o r : # f f e c b 5 ; b a c k g r o u n d - i m a g e : u r l ( " d a t a : i m a g e / s v g + x m l , % 3 C s v g % 2 0 x m l n s % 3 D % 2 2 h t t p % 3 A / / w w w . w 3 . o r g / 2 0 0 0 / s v g % 2 2 % 2 0 w i d t h % 3 D % 2 2 2 4 % 2 2 % 2 0 h e i g h t % 3 D % 2 2 2 4 % 2 2 % 2 0 f i l l % 3 D % 2 2 % 2 3 6 6 4 d 0 3 % 2 2 % 2 0 v i e w B o x % 3 D % 2 2 0 % 2 0 0 % 2 0 1 6 % 2 0 1 6 % 2 2 % 3 E % 3 C p a t h % 2 0 d % 3 D % 2 2 M 8 . 9 8 2 % 2 0 1 . 5 6 6 a 1 . 1 3 % 2 0 1 . 1 3 % 2 0 0 % 2 0 0 % 2 0 0 - 1 . 9 6 % 2 0 0 L . 1 6 5 % 2 0 1 3 . 2 3 3 c - . 4 5 7 . 7 7 8 . 0 9 1 % 2 0 1 . 7 6 7 . 9 8 % 2 0 1 . 7 6 7 h 1 3 . 7 1 3 c . 8 8 9 % 2 0 0 % 2 0 1 . 4 3 8 - . 9 9 . 9 8 - 1 . 7 6 7 L 8 . 9 8 2 % 2 0 1 . 5 6 6 z M 8 % 2 0 5 c . 5 3 5 % 2 0 0 % 2 0 . 9 5 4 . 4 6 2 . 9 . 9 9 5 l - . 3 5 % 2 0 3 . 5 0 7 a . 5 5 2 . 5 5 2 % 2 0 0 % 2 0 0 % 2 0 1 - 1 . 1 % 2 0 0 L 7 . 1 % 2 0 5 . 9 9 5 A . 9 0 5 . 9 0 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 8 % 2 0 5 z m . 0 0 2 % 2 0 6 a 1 % 2 0 1 % 2 0 0 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 2 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 - 2 z % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . a l e r t . c a u t i o n { c o l o r : # 8 4 2 0 2 9 ; b a c k g r o u n d - c o l o r : # f 8 d 7 d a ; b o r d e r - c o l o r : # f 5 c 2 c 7 ; b a c k g r o u n d - i m a g e : u r l ( " d a t a : i m a g e / s v g + x m l , % 3 C s v g % 2 0 x m l n s % 3 D % 2 2 h t t p % 3 A / / w w w . w 3 . o r g / 2 0 0 0 / s v g % 2 2 % 2 0 w i d t h % 3 D % 2 2 2 4 % 2 2 % 2 0 h e i g h t % 3 D % 2 2 2 4 % 2 2 % 2 0 f i l l % 3 D % 2 2 % 2 3 8 4 2 0 2 9 % 2 2 % 2 0 v i e w B o x % 3 D % 2 2 0 % 2 0 0 % 2 0 1 6 % 2 0 1 6 % 2 2 % 3 E % 3 C p a t h % 2 0 d % 3 D % 2 2 M 1 1 . 4 6 . 1 4 6 A . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 1 1 . 1 0 7 % 2 0 0 H 4 . 8 9 3 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 - . 3 5 3 . 1 4 6 L . 1 4 6 % 2 0 4 . 5 4 A . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 4 . 8 9 3 v 6 . 2 1 4 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 . 1 4 6 . 3 5 3 l 4 . 3 9 4 % 2 0 4 . 3 9 4 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 . 3 5 3 . 1 4 6 h 6 . 2 1 4 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 . 3 5 3 - . 1 4 6 l 4 . 3 9 4 - 4 . 3 9 4 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 % 2 0 . 1 4 6 - . 3 5 3 V 4 . 8 9 3 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 0 - . 1 4 6 - . 3 5 3 z M 8 % 2 0 4 c . 5 3 5 % 2 0 0 % 2 0 . 9 5 4 . 4 6 2 . 9 . 9 9 5 l - . 3 5 % 2 0 3 . 5 0 7 a . 5 5 2 . 5 5 2 % 2 0 0 % 2 0 0 % 2 0 1 - 1 . 1 % 2 0 0 L 7 . 1 % 2 0 4 . 9 9 5 A . 9 0 5 . 9 0 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 8 % 2 0 4 m . 0 0 2 % 2 0 6 a 1 % 2 0 1 % 2 0 0 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 2 % 2 0 1 % 2 0 1 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 0 - 2 % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . a l e r t . d a n g e r { c o l o r : # 8 4 2 0 2 9 ; b a c k g r o u n d - c o l o r :
2025-02-13 15:23:26 +01:00
< style > /*! custom.css */ < / style > < / head >
< body >
< nav class = "pdoc" >
< label id = "navtoggle" for = "togglestate" class = "pdoc-button" > < svg xmlns = 'http://www.w3.org/2000/svg' viewBox = '0 0 30 30' > < path stroke-linecap = 'round' stroke = "currentColor" stroke-miterlimit = '10' stroke-width = '2' d = 'M4 7h22M4 15h22M4 23h22' / > < / svg > < / label >
< input id = "togglestate" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div > < a class = "pdoc-button module-list-button" href = "../sqlglot.html" >
< svg xmlns = "http://www.w3.org/2000/svg" width = "16" height = "16" fill = "currentColor" class = "bi bi-box-arrow-in-left" viewBox = "0 0 16 16" >
< path fill-rule = "evenodd" d = "M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z" / >
< path fill-rule = "evenodd" d = "M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z" / >
< / svg > sqlglot< / a >
< input type = "search" placeholder = "Search..." role = "searchbox" aria-label = "search"
pattern=".+" required>
2025-02-13 15:48:10 +01:00
< h2 > API Documentation< / h2 >
< ul class = "memberlist" >
2025-02-13 21:41:14 +01:00
< li >
< a class = "function" href = "#preprocess" > preprocess< / a >
< / li >
2025-02-13 21:52:32 +01:00
< li >
< a class = "function" href = "#unnest_generate_date_array_using_recursive_cte" > unnest_generate_date_array_using_recursive_cte< / a >
< / li >
< li >
< a class = "function" href = "#unnest_generate_series" > unnest_generate_series< / a >
< / li >
2025-02-13 15:23:26 +01:00
< li >
< a class = "function" href = "#unalias_group" > unalias_group< / a >
< / li >
< li >
< a class = "function" href = "#eliminate_distinct_on" > eliminate_distinct_on< / a >
< / li >
2025-02-13 15:46:19 +01:00
< li >
< a class = "function" href = "#eliminate_qualify" > eliminate_qualify< / a >
< / li >
2025-02-13 15:23:26 +01:00
< li >
< a class = "function" href = "#remove_precision_parameterized_types" > remove_precision_parameterized_types< / a >
< / li >
< li >
2025-02-13 21:32:41 +01:00
< a class = "function" href = "#unqualify_unnest" > unqualify_unnest< / a >
2025-02-13 15:52:09 +01:00
< / li >
< li >
2025-02-13 21:32:41 +01:00
< a class = "function" href = "#unnest_to_explode" > unnest_to_explode< / a >
2025-02-13 15:52:09 +01:00
< / li >
2025-02-13 21:03:38 +01:00
< li >
2025-04-06 10:17:01 +02:00
< a class = "function" href = "#explode_projection_to_unnest" > explode_projection_to_unnest< / a >
2025-02-13 21:03:38 +01:00
< / li >
< li >
< a class = "function" href = "#add_within_group_for_percentiles" > add_within_group_for_percentiles< / a >
< / li >
2025-02-13 15:57:23 +01:00
< li >
< a class = "function" href = "#remove_within_group_for_percentiles" > remove_within_group_for_percentiles< / a >
< / li >
< li >
< a class = "function" href = "#add_recursive_cte_column_names" > add_recursive_cte_column_names< / a >
< / li >
2025-02-13 15:58:40 +01:00
< li >
< a class = "function" href = "#epoch_cast_to_ts" > epoch_cast_to_ts< / a >
< / li >
2025-02-13 21:03:38 +01:00
< li >
< a class = "function" href = "#eliminate_semi_and_anti_joins" > eliminate_semi_and_anti_joins< / a >
< / li >
2025-02-13 21:16:09 +01:00
< li >
< a class = "function" href = "#eliminate_full_outer_join" > eliminate_full_outer_join< / a >
< / li >
< li >
< a class = "function" href = "#move_ctes_to_top_level" > move_ctes_to_top_level< / a >
< / li >
2025-02-13 21:17:09 +01:00
< li >
< a class = "function" href = "#ensure_bools" > ensure_bools< / a >
< / li >
< li >
< a class = "function" href = "#unqualify_columns" > unqualify_columns< / a >
< / li >
2025-02-13 21:27:51 +01:00
< li >
< a class = "function" href = "#remove_unique_constraints" > remove_unique_constraints< / a >
< / li >
< li >
< a class = "function" href = "#ctas_with_tmp_tables_to_create_tmp_view" > ctas_with_tmp_tables_to_create_tmp_view< / a >
< / li >
< li >
< a class = "function" href = "#move_schema_columns_to_partitioned_by" > move_schema_columns_to_partitioned_by< / a >
< / li >
< li >
< a class = "function" href = "#move_partitioned_by_to_schema_columns" > move_partitioned_by_to_schema_columns< / a >
< / li >
2025-02-13 21:29:39 +01:00
< li >
< a class = "function" href = "#struct_kv_to_alias" > struct_kv_to_alias< / a >
< / li >
2025-02-13 15:23:26 +01:00
< li >
2025-02-13 21:41:14 +01:00
< a class = "function" href = "#eliminate_join_marks" > eliminate_join_marks< / a >
2025-02-13 15:23:26 +01:00
< / li >
2025-02-13 21:56:38 +01:00
< li >
< a class = "function" href = "#any_to_exists" > any_to_exists< / a >
< / li >
2025-05-24 07:15:28 +02:00
< li >
< a class = "function" href = "#eliminate_window_clause" > eliminate_window_clause< / a >
< / li >
2025-02-13 15:23:26 +01:00
< / 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
< / a >
< / div >
< / nav >
< main class = "pdoc" >
< section class = "module-info" >
< a class = "pdoc-button git-button" href = "https://github.com/tobymao/sqlglot/tree/main/sqlglot/transforms.py" > Edit on GitHub< / a >
< h1 class = "modulename" >
< a href = "./../sqlglot.html" > sqlglot< / a > < wbr > .transforms < / h1 >
< input id = "mod-transforms-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< label class = "view-source-button" for = "mod-transforms-view-source" > < span > View Source< / span > < / label >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "L-1" > < a href = "#L-1" > < span class = "linenos" > 1< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > __future__< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > annotations< / span >
< / span > < span id = "L-2" > < a href = "#L-2" > < span class = "linenos" > 2< / span > < / a >
< / span > < span id = "L-3" > < a href = "#L-3" > < span class = "linenos" > 3< / span > < / a > < span class = "kn" > import< / span > < span class = "w" > < / span > < span class = "nn" > typing< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "nn" > t< / span >
< / span > < span id = "L-4" > < a href = "#L-4" > < span class = "linenos" > 4< / span > < / a >
< / span > < span id = "L-5" > < a href = "#L-5" > < span class = "linenos" > 5< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > expressions< / span > < span class = "k" > as< / span > < span class = "n" > exp< / span >
< / span > < span id = "L-6" > < a href = "#L-6" > < span class = "linenos" > 6< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.errors< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > UnsupportedError< / span >
< / span > < span id = "L-7" > < a href = "#L-7" > < span class = "linenos" > 7< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.helper< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > find_new_name< / span > < span class = "p" > ,< / span > < span class = "n" > name_sequence< / span >
< / span > < span id = "L-8" > < a href = "#L-8" > < span class = "linenos" > 8< / span > < / a >
< / span > < span id = "L-9" > < a href = "#L-9" > < span class = "linenos" > 9< / span > < / a >
< / span > < span id = "L-10" > < a href = "#L-10" > < span class = "linenos" > 10< / span > < / a > < span class = "k" > if< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > TYPE_CHECKING< / span > < span class = "p" > :< / span >
< / span > < span id = "L-11" > < a href = "#L-11" > < span class = "linenos" > 11< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot._typing< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > E< / span >
< / span > < span id = "L-12" > < a href = "#L-12" > < span class = "linenos" > 12< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.generator< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > Generator< / span >
< / span > < span id = "L-13" > < a href = "#L-13" > < span class = "linenos" > 13< / span > < / a >
< / span > < span id = "L-14" > < a href = "#L-14" > < span class = "linenos" > 14< / span > < / a >
< / span > < span id = "L-15" > < a href = "#L-15" > < span class = "linenos" > 15< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > preprocess< / span > < span class = "p" > (< / span >
< / span > < span id = "L-16" > < a href = "#L-16" > < span class = "linenos" > 16< / span > < / a > < span class = "n" > transforms< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]],< / span >
< / span > < span id = "L-17" > < a href = "#L-17" > < span class = "linenos" > 17< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > Generator< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "nb" > str< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-18" > < a href = "#L-18" > < span class = "linenos" > 18< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-19" > < a href = "#L-19" > < span class = "linenos" > 19< / span > < / a > < span class = "sd" > Creates a new transform by chaining a sequence of transformations and converts the resulting< / span >
< / span > < span id = "L-20" > < a href = "#L-20" > < span class = "linenos" > 20< / span > < / a > < span class = "sd" > expression to SQL, using either the " _sql" method corresponding to the resulting expression,< / span >
< / span > < span id = "L-21" > < a href = "#L-21" > < span class = "linenos" > 21< / span > < / a > < span class = "sd" > or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).< / span >
< / span > < span id = "L-22" > < a href = "#L-22" > < span class = "linenos" > 22< / span > < / a >
< / span > < span id = "L-23" > < a href = "#L-23" > < span class = "linenos" > 23< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-24" > < a href = "#L-24" > < span class = "linenos" > 24< / span > < / a > < span class = "sd" > transforms: sequence of transform functions. These will be called in order.< / span >
< / span > < span id = "L-25" > < a href = "#L-25" > < span class = "linenos" > 25< / span > < / a >
< / span > < span id = "L-26" > < a href = "#L-26" > < span class = "linenos" > 26< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-27" > < a href = "#L-27" > < span class = "linenos" > 27< / span > < / a > < span class = "sd" > Function that can be used as a generator transform.< / span >
< / span > < span id = "L-28" > < a href = "#L-28" > < span class = "linenos" > 28< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-29" > < a href = "#L-29" > < span class = "linenos" > 29< / span > < / a >
< / span > < span id = "L-30" > < a href = "#L-30" > < span class = "linenos" > 30< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _to_sql< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "p" > :< / span >
< / span > < span id = "L-31" > < a href = "#L-31" > < span class = "linenos" > 31< / span > < / a > < span class = "n" > expression_type< / span > < span class = "o" > =< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-32" > < a href = "#L-32" > < span class = "linenos" > 32< / span > < / a >
< / span > < span id = "L-33" > < a href = "#L-33" > < span class = "linenos" > 33< / span > < / a > < span class = "k" > try< / span > < span class = "p" > :< / span >
< / span > < span id = "L-34" > < a href = "#L-34" > < span class = "linenos" > 34< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > transforms< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ](< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-35" > < a href = "#L-35" > < span class = "linenos" > 35< / span > < / a > < span class = "k" > for< / span > < span class = "n" > transform< / span > < span class = "ow" > in< / span > < span class = "n" > transforms< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :]:< / span >
< / span > < span id = "L-36" > < a href = "#L-36" > < span class = "linenos" > 36< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > transform< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-37" > < a href = "#L-37" > < span class = "linenos" > 37< / span > < / a > < span class = "k" > except< / span > < span class = "n" > UnsupportedError< / span > < span class = "k" > as< / span > < span class = "n" > unsupported_error< / span > < span class = "p" > :< / span >
< / span > < span id = "L-38" > < a href = "#L-38" > < span class = "linenos" > 38< / span > < / a > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > unsupported< / span > < span class = "p" > (< / span > < span class = "nb" > str< / span > < span class = "p" > (< / span > < span class = "n" > unsupported_error< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-39" > < a href = "#L-39" > < span class = "linenos" > 39< / span > < / a >
< / span > < span id = "L-40" > < a href = "#L-40" > < span class = "linenos" > 40< / span > < / a > < span class = "n" > _sql_handler< / span > < span class = "o" > =< / span > < span class = "nb" > getattr< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > key< / span > < span class = "o" > +< / span > < span class = "s2" > " _sql" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "L-41" > < a href = "#L-41" > < span class = "linenos" > 41< / span > < / a > < span class = "k" > if< / span > < span class = "n" > _sql_handler< / span > < span class = "p" > :< / span >
< / span > < span id = "L-42" > < a href = "#L-42" > < span class = "linenos" > 42< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _sql_handler< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-43" > < a href = "#L-43" > < span class = "linenos" > 43< / span > < / a >
< / span > < span id = "L-44" > < a href = "#L-44" > < span class = "linenos" > 44< / span > < / a > < span class = "n" > transforms_handler< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > TRANSFORMS< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-45" > < a href = "#L-45" > < span class = "linenos" > 45< / span > < / a > < span class = "k" > if< / span > < span class = "n" > transforms_handler< / span > < span class = "p" > :< / span >
< / span > < span id = "L-46" > < a href = "#L-46" > < span class = "linenos" > 46< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression_type< / span > < span class = "ow" > is< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-47" > < a href = "#L-47" > < span class = "linenos" > 47< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Func< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-48" > < a href = "#L-48" > < span class = "linenos" > 48< / span > < / a > < span class = "k" > return< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > function_fallback_sql< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-49" > < a href = "#L-49" > < span class = "linenos" > 49< / span > < / a >
< / span > < span id = "L-50" > < a href = "#L-50" > < span class = "linenos" > 50< / span > < / a > < span class = "c1" > # Ensures we don' t enter an infinite loop. This can happen when the original expression< / span >
< / span > < span id = "L-51" > < a href = "#L-51" > < span class = "linenos" > 51< / span > < / a > < span class = "c1" > # has the same type as the final expression and there' s no _sql method available for it,< / span >
< / span > < span id = "L-52" > < a href = "#L-52" > < span class = "linenos" > 52< / span > < / a > < span class = "c1" > # because then it' d re-enter _to_sql.< / span >
< / span > < span id = "L-53" > < a href = "#L-53" > < span class = "linenos" > 53< / span > < / a > < span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< / span > < span id = "L-54" > < a href = "#L-54" > < span class = "linenos" > 54< / span > < / a > < span class = "sa" > f< / span > < span class = "s2" > " Expression type < / span > < span class = "si" > {< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "si" > }< / span > < span class = "s2" > requires a _sql method in order to be transformed." < / span >
< / span > < span id = "L-55" > < a href = "#L-55" > < span class = "linenos" > 55< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-56" > < a href = "#L-56" > < span class = "linenos" > 56< / span > < / a >
< / span > < span id = "L-57" > < a href = "#L-57" > < span class = "linenos" > 57< / span > < / a > < span class = "k" > return< / span > < span class = "n" > transforms_handler< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-58" > < a href = "#L-58" > < span class = "linenos" > 58< / span > < / a >
< / span > < span id = "L-59" > < a href = "#L-59" > < span class = "linenos" > 59< / span > < / a > < span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unsupported expression type < / span > < span class = "si" > {< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "si" > }< / span > < span class = "s2" > ." < / span > < span class = "p" > )< / span >
< / span > < span id = "L-60" > < a href = "#L-60" > < span class = "linenos" > 60< / span > < / a >
< / span > < span id = "L-61" > < a href = "#L-61" > < span class = "linenos" > 61< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _to_sql< / span >
< / span > < span id = "L-62" > < a href = "#L-62" > < span class = "linenos" > 62< / span > < / a >
< / span > < span id = "L-63" > < a href = "#L-63" > < span class = "linenos" > 63< / span > < / a >
< / span > < span id = "L-64" > < a href = "#L-64" > < span class = "linenos" > 64< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_generate_date_array_using_recursive_cte< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-65" > < a href = "#L-65" > < span class = "linenos" > 65< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-66" > < a href = "#L-66" > < span class = "linenos" > 66< / span > < / a > < span class = "n" > count< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span >
< / span > < span id = "L-67" > < a href = "#L-67" > < span class = "linenos" > 67< / span > < / a > < span class = "n" > recursive_ctes< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "L-68" > < a href = "#L-68" > < span class = "linenos" > 68< / span > < / a >
< / span > < span id = "L-69" > < a href = "#L-69" > < span class = "linenos" > 69< / span > < / a > < span class = "k" > for< / span > < span class = "n" > unnest< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-70" > < a href = "#L-70" > < span class = "linenos" > 70< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-71" > < a href = "#L-71" > < span class = "linenos" > 71< / span > < / a > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-72" > < a href = "#L-72" > < span class = "linenos" > 72< / span > < / a > < span class = "ow" > or< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-73" > < a href = "#L-73" > < span class = "linenos" > 73< / span > < / a > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateDateArray< / span > < span class = "p" > )< / span >
< / span > < span id = "L-74" > < a href = "#L-74" > < span class = "linenos" > 74< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-75" > < a href = "#L-75" > < span class = "linenos" > 75< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "L-76" > < a href = "#L-76" > < span class = "linenos" > 76< / span > < / a >
< / span > < span id = "L-77" > < a href = "#L-77" > < span class = "linenos" > 77< / span > < / a > < span class = "n" > generate_date_array< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-78" > < a href = "#L-78" > < span class = "linenos" > 78< / span > < / a > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " start" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-79" > < a href = "#L-79" > < span class = "linenos" > 79< / span > < / a > < span class = "n" > end< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " end" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-80" > < a href = "#L-80" > < span class = "linenos" > 80< / span > < / a > < span class = "n" > step< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " step" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-81" > < a href = "#L-81" > < span class = "linenos" > 81< / span > < / a >
< / span > < span id = "L-82" > < a href = "#L-82" > < span class = "linenos" > 82< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > start< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "n" > end< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > step< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Interval< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-83" > < a href = "#L-83" > < span class = "linenos" > 83< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "L-84" > < a href = "#L-84" > < span class = "linenos" > 84< / span > < / a >
< / span > < span id = "L-85" > < a href = "#L-85" > < span class = "linenos" > 85< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-86" > < a href = "#L-86" > < span class = "linenos" > 86< / span > < / a > < span class = "n" > column_name< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "s2" > " date_value" < / span >
< / span > < span id = "L-87" > < a href = "#L-87" > < span class = "linenos" > 87< / span > < / a >
< / span > < span id = "L-88" > < a href = "#L-88" > < span class = "linenos" > 88< / span > < / a > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-89" > < a href = "#L-89" > < span class = "linenos" > 89< / span > < / a > < span class = "n" > date_add< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "L-90" > < a href = "#L-90" > < span class = "linenos" > 90< / span > < / a > < span class = "s2" > " date_add" < / span > < span class = "p" > ,< / span > < span class = "n" > column_name< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > step< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > ),< / span > < span class = "n" > step< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " unit" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-91" > < a href = "#L-91" > < span class = "linenos" > 91< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-92" > < a href = "#L-92" > < span class = "linenos" > 92< / span > < / a > < span class = "n" > cast_date_add< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > date_add< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-93" > < a href = "#L-93" > < span class = "linenos" > 93< / span > < / a >
< / span > < span id = "L-94" > < a href = "#L-94" > < span class = "linenos" > 94< / span > < / a > < span class = "n" > cte_name< / span > < span class = "o" > =< / span > < span class = "s2" > " _generated_dates" < / span > < span class = "o" > +< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " _< / span > < span class = "si" > {< / span > < span class = "n" > count< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span > < span class = "k" > if< / span > < span class = "n" > count< / span > < span class = "k" > else< / span > < span class = "s2" > " " < / span > < span class = "p" > )< / span >
< / span > < span id = "L-95" > < a href = "#L-95" > < span class = "linenos" > 95< / span > < / a >
< / span > < span id = "L-96" > < a href = "#L-96" > < span class = "linenos" > 96< / span > < / a > < span class = "n" > base_query< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "o" > .< / span > < span class = "n" > as_< / span > < span class = "p" > (< / span > < span class = "n" > column_name< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-97" > < a href = "#L-97" > < span class = "linenos" > 97< / span > < / a > < span class = "n" > recursive_query< / span > < span class = "o" > =< / span > < span class = "p" > (< / span >
< / span > < span id = "L-98" > < a href = "#L-98" > < span class = "linenos" > 98< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > cast_date_add< / span > < span class = "p" > )< / span >
< / span > < span id = "L-99" > < a href = "#L-99" > < span class = "linenos" > 99< / span > < / a > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-100" > < a href = "#L-100" > < span class = "linenos" > 100< / span > < / a > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > cast_date_add< / span > < span class = "o" > < =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > end< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > ))< / span >
< / span > < span id = "L-101" > < a href = "#L-101" > < span class = "linenos" > 101< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-102" > < a href = "#L-102" > < span class = "linenos" > 102< / span > < / a > < span class = "n" > cte_query< / span > < span class = "o" > =< / span > < span class = "n" > base_query< / span > < span class = "o" > .< / span > < span class = "n" > union< / span > < span class = "p" > (< / span > < span class = "n" > recursive_query< / span > < span class = "p" > ,< / span > < span class = "n" > distinct< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-103" > < a href = "#L-103" > < span class = "linenos" > 103< / span > < / a >
< / span > < span id = "L-104" > < a href = "#L-104" > < span class = "linenos" > 104< / span > < / a > < span class = "n" > generate_dates_query< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > column_name< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-105" > < a href = "#L-105" > < span class = "linenos" > 105< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > generate_dates_query< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-106" > < a href = "#L-106" > < span class = "linenos" > 106< / span > < / a >
< / span > < span id = "L-107" > < a href = "#L-107" > < span class = "linenos" > 107< / span > < / a > < span class = "n" > recursive_ctes< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span >
< / span > < span id = "L-108" > < a href = "#L-108" > < span class = "linenos" > 108< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > CTE< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > cte_query< / span > < span class = "p" > ),< / span > < span class = "n" > cte_name< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > column_name< / span > < span class = "p" > ])< / span >
< / span > < span id = "L-109" > < a href = "#L-109" > < span class = "linenos" > 109< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-110" > < a href = "#L-110" > < span class = "linenos" > 110< / span > < / a > < span class = "n" > count< / span > < span class = "o" > +=< / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-111" > < a href = "#L-111" > < span class = "linenos" > 111< / span > < / a >
< / span > < span id = "L-112" > < a href = "#L-112" > < span class = "linenos" > 112< / span > < / a > < span class = "k" > if< / span > < span class = "n" > recursive_ctes< / span > < span class = "p" > :< / span >
< / span > < span id = "L-113" > < a href = "#L-113" > < span class = "linenos" > 113< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-114" > < a href = "#L-114" > < span class = "linenos" > 114< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " recursive" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "L-115" > < a href = "#L-115" > < span class = "linenos" > 115< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "o" > *< / span > < span class = "n" > recursive_ctes< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ])< / span >
< / span > < span id = "L-116" > < a href = "#L-116" > < span class = "linenos" > 116< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "n" > with_expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-117" > < a href = "#L-117" > < span class = "linenos" > 117< / span > < / a >
< / span > < span id = "L-118" > < a href = "#L-118" > < span class = "linenos" > 118< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-119" > < a href = "#L-119" > < span class = "linenos" > 119< / span > < / a >
< / span > < span id = "L-120" > < a href = "#L-120" > < span class = "linenos" > 120< / span > < / a >
< / span > < span id = "L-121" > < a href = "#L-121" > < span class = "linenos" > 121< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_generate_series< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-122" > < a href = "#L-122" > < span class = "linenos" > 122< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Unnests GENERATE_SERIES or SEQUENCE table references." " " < / span >
< / span > < span id = "L-123" > < a href = "#L-123" > < span class = "linenos" > 123< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-124" > < a href = "#L-124" > < span class = "linenos" > 124< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Table< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateSeries< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-125" > < a href = "#L-125" > < span class = "linenos" > 125< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > this< / span > < span class = "p" > ])< / span >
< / span > < span id = "L-126" > < a href = "#L-126" > < span class = "linenos" > 126< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span >
< / span > < span id = "L-127" > < a href = "#L-127" > < span class = "linenos" > 127< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "s2" > " _u" < / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > ],< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-128" > < a href = "#L-128" > < span class = "linenos" > 128< / span > < / a >
< / span > < span id = "L-129" > < a href = "#L-129" > < span class = "linenos" > 129< / span > < / a > < span class = "k" > return< / span > < span class = "n" > unnest< / span >
< / span > < span id = "L-130" > < a href = "#L-130" > < span class = "linenos" > 130< / span > < / a >
< / span > < span id = "L-131" > < a href = "#L-131" > < span class = "linenos" > 131< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-132" > < a href = "#L-132" > < span class = "linenos" > 132< / span > < / a >
< / span > < span id = "L-133" > < a href = "#L-133" > < span class = "linenos" > 133< / span > < / a >
< / span > < span id = "L-134" > < a href = "#L-134" > < span class = "linenos" > 134< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unalias_group< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-135" > < a href = "#L-135" > < span class = "linenos" > 135< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-136" > < a href = "#L-136" > < span class = "linenos" > 136< / span > < / a > < span class = "sd" > Replace references to select aliases in GROUP BY clauses.< / span >
< / span > < span id = "L-137" > < a href = "#L-137" > < span class = "linenos" > 137< / span > < / a >
< / span > < span id = "L-138" > < a href = "#L-138" > < span class = "linenos" > 138< / span > < / a > < span class = "sd" > Example:< / span >
< / span > < span id = "L-139" > < a href = "#L-139" > < span class = "linenos" > 139< / span > < / a > < span class = "sd" > > > > import sqlglot< / span >
< / span > < span id = "L-140" > < a href = "#L-140" > < span class = "linenos" > 140< / span > < / a > < span class = "sd" > > > > sqlglot.parse_one(" SELECT a AS b FROM x GROUP BY b" ).transform(unalias_group).sql()< / span >
< / span > < span id = "L-141" > < a href = "#L-141" > < span class = "linenos" > 141< / span > < / a > < span class = "sd" > ' SELECT a AS b FROM x GROUP BY 1' < / span >
< / span > < span id = "L-142" > < a href = "#L-142" > < span class = "linenos" > 142< / span > < / a >
< / span > < span id = "L-143" > < a href = "#L-143" > < span class = "linenos" > 143< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-144" > < a href = "#L-144" > < span class = "linenos" > 144< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "L-145" > < a href = "#L-145" > < span class = "linenos" > 145< / span > < / a >
< / span > < span id = "L-146" > < a href = "#L-146" > < span class = "linenos" > 146< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-147" > < a href = "#L-147" > < span class = "linenos" > 147< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "L-148" > < a href = "#L-148" > < span class = "linenos" > 148< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-149" > < a href = "#L-149" > < span class = "linenos" > 149< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Group< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-150" > < a href = "#L-150" > < span class = "linenos" > 150< / span > < / a > < span class = "n" > aliased_selects< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "L-151" > < a href = "#L-151" > < span class = "linenos" > 151< / span > < / a > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span > < span class = "n" > i< / span >
< / span > < span id = "L-152" > < a href = "#L-152" > < span class = "linenos" > 152< / span > < / a > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span >
< / span > < span id = "L-153" > < a href = "#L-153" > < span class = "linenos" > 153< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-154" > < a href = "#L-154" > < span class = "linenos" > 154< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "L-155" > < a href = "#L-155" > < span class = "linenos" > 155< / span > < / a >
< / span > < span id = "L-156" > < a href = "#L-156" > < span class = "linenos" > 156< / span > < / a > < span class = "k" > for< / span > < span class = "n" > group_by< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "L-157" > < a href = "#L-157" > < span class = "linenos" > 157< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-158" > < a href = "#L-158" > < span class = "linenos" > 158< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > group_by< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span >
< / span > < span id = "L-159" > < a href = "#L-159" > < span class = "linenos" > 159< / span > < / a > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > table< / span >
< / span > < span id = "L-160" > < a href = "#L-160" > < span class = "linenos" > 160< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "ow" > in< / span > < span class = "n" > aliased_selects< / span >
< / span > < span id = "L-161" > < a href = "#L-161" > < span class = "linenos" > 161< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-162" > < a href = "#L-162" > < span class = "linenos" > 162< / span > < / a > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > aliased_selects< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > )))< / span >
< / span > < span id = "L-163" > < a href = "#L-163" > < span class = "linenos" > 163< / span > < / a >
< / span > < span id = "L-164" > < a href = "#L-164" > < span class = "linenos" > 164< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-165" > < a href = "#L-165" > < span class = "linenos" > 165< / span > < / a >
< / span > < span id = "L-166" > < a href = "#L-166" > < span class = "linenos" > 166< / span > < / a >
< / span > < span id = "L-167" > < a href = "#L-167" > < span class = "linenos" > 167< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_distinct_on< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-168" > < a href = "#L-168" > < span class = "linenos" > 168< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-169" > < a href = "#L-169" > < span class = "linenos" > 169< / span > < / a > < span class = "sd" > Convert SELECT DISTINCT ON statements to a subquery with a window function.< / span >
< / span > < span id = "L-170" > < a href = "#L-170" > < span class = "linenos" > 170< / span > < / a >
< / span > < span id = "L-171" > < a href = "#L-171" > < span class = "linenos" > 171< / span > < / a > < span class = "sd" > This is useful for dialects that don' t support SELECT DISTINCT ON but support window functions.< / span >
< / span > < span id = "L-172" > < a href = "#L-172" > < span class = "linenos" > 172< / span > < / a >
< / span > < span id = "L-173" > < a href = "#L-173" > < span class = "linenos" > 173< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-174" > < a href = "#L-174" > < span class = "linenos" > 174< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "L-175" > < a href = "#L-175" > < span class = "linenos" > 175< / span > < / a >
< / span > < span id = "L-176" > < a href = "#L-176" > < span class = "linenos" > 176< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-177" > < a href = "#L-177" > < span class = "linenos" > 177< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "L-178" > < a href = "#L-178" > < span class = "linenos" > 178< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-179" > < a href = "#L-179" > < span class = "linenos" > 179< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-180" > < a href = "#L-180" > < span class = "linenos" > 180< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span >
< / span > < span id = "L-181" > < a href = "#L-181" > < span class = "linenos" > 181< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-182" > < a href = "#L-182" > < span class = "linenos" > 182< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > ),< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
< / span > < span id = "L-183" > < a href = "#L-183" > < span class = "linenos" > 183< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-184" > < a href = "#L-184" > < span class = "linenos" > 184< / span > < / a > < span class = "n" > row_number_window_alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > ,< / span > < span class = "s2" > " _row_number" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-185" > < a href = "#L-185" > < span class = "linenos" > 185< / span > < / a >
< / span > < span id = "L-186" > < a href = "#L-186" > < span class = "linenos" > 186< / span > < / a > < span class = "n" > distinct_cols< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " on" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-187" > < a href = "#L-187" > < span class = "linenos" > 187< / span > < / a > < span class = "n" > window< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > RowNumber< / span > < span class = "p" > (),< / span > < span class = "n" > partition_by< / span > < span class = "o" > =< / span > < span class = "n" > distinct_cols< / span > < span class = "p" > )< / span >
< / span > < span id = "L-188" > < a href = "#L-188" > < span class = "linenos" > 188< / span > < / a >
< / span > < span id = "L-189" > < a href = "#L-189" > < span class = "linenos" > 189< / span > < / a > < span class = "n" > order< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-190" > < a href = "#L-190" > < span class = "linenos" > 190< / span > < / a > < span class = "k" > if< / span > < span class = "n" > order< / span > < span class = "p" > :< / span >
< / span > < span id = "L-191" > < a href = "#L-191" > < span class = "linenos" > 191< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "n" > order< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-192" > < a href = "#L-192" > < span class = "linenos" > 192< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-193" > < a href = "#L-193" > < span class = "linenos" > 193< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span > < span class = "k" > for< / span > < span class = "n" > c< / span > < span class = "ow" > in< / span > < span class = "n" > distinct_cols< / span > < span class = "p" > ]))< / span >
< / span > < span id = "L-194" > < a href = "#L-194" > < span class = "linenos" > 194< / span > < / a >
< / span > < span id = "L-195" > < a href = "#L-195" > < span class = "linenos" > 195< / span > < / a > < span class = "n" > window< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > ,< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-196" > < a href = "#L-196" > < span class = "linenos" > 196< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-197" > < a href = "#L-197" > < span class = "linenos" > 197< / span > < / a >
< / span > < span id = "L-198" > < a href = "#L-198" > < span class = "linenos" > 198< / span > < / a > < span class = "c1" > # We add aliases to the projections so that we can safely reference them in the outer query< / span >
< / span > < span id = "L-199" > < a href = "#L-199" > < span class = "linenos" > 199< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "L-200" > < a href = "#L-200" > < span class = "linenos" > 200< / span > < / a > < span class = "n" > taken_names< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > }< / span >
< / span > < span id = "L-201" > < a href = "#L-201" > < span class = "linenos" > 201< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-202" > < a href = "#L-202" > < span class = "linenos" > 202< / span > < / a > < span class = "k" > if< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > is_star< / span > < span class = "p" > :< / span >
< / span > < span id = "L-203" > < a href = "#L-203" > < span class = "linenos" > 203< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Star< / span > < span class = "p" > ()]< / span >
< / span > < span id = "L-204" > < a href = "#L-204" > < span class = "linenos" > 204< / span > < / a > < span class = "k" > break< / span >
< / span > < span id = "L-205" > < a href = "#L-205" > < span class = "linenos" > 205< / span > < / a >
< / span > < span id = "L-206" > < a href = "#L-206" > < span class = "linenos" > 206< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-207" > < a href = "#L-207" > < span class = "linenos" > 207< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_names< / span > < span class = "p" > ,< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "ow" > or< / span > < span class = "s2" > " _col" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-208" > < a href = "#L-208" > < span class = "linenos" > 208< / span > < / a > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " quoted" < / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "kc" > None< / span >
< / span > < span id = "L-209" > < a href = "#L-209" > < span class = "linenos" > 209< / span > < / a > < span class = "n" > select< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ,< / span > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > quoted< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-210" > < a href = "#L-210" > < span class = "linenos" > 210< / span > < / a >
< / span > < span id = "L-211" > < a href = "#L-211" > < span class = "linenos" > 211< / span > < / a > < span class = "n" > taken_names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-212" > < a href = "#L-212" > < span class = "linenos" > 212< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ])< / span >
< / span > < span id = "L-213" > < a href = "#L-213" > < span class = "linenos" > 213< / span > < / a >
< / span > < span id = "L-214" > < a href = "#L-214" > < span class = "linenos" > 214< / span > < / a > < span class = "k" > return< / span > < span class = "p" > (< / span >
< / span > < span id = "L-215" > < a href = "#L-215" > < span class = "linenos" > 215< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > new_selects< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-216" > < a href = "#L-216" > < span class = "linenos" > 216< / span > < / a > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "s2" > " _t" < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-217" > < a href = "#L-217" > < span class = "linenos" > 217< / span > < / a > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-218" > < a href = "#L-218" > < span class = "linenos" > 218< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-219" > < a href = "#L-219" > < span class = "linenos" > 219< / span > < / a >
< / span > < span id = "L-220" > < a href = "#L-220" > < span class = "linenos" > 220< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-221" > < a href = "#L-221" > < span class = "linenos" > 221< / span > < / a >
< / span > < span id = "L-222" > < a href = "#L-222" > < span class = "linenos" > 222< / span > < / a >
< / span > < span id = "L-223" > < a href = "#L-223" > < span class = "linenos" > 223< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_qualify< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-224" > < a href = "#L-224" > < span class = "linenos" > 224< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-225" > < a href = "#L-225" > < span class = "linenos" > 225< / span > < / a > < span class = "sd" > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / span >
< / span > < span id = "L-226" > < a href = "#L-226" > < span class = "linenos" > 226< / span > < / a >
< / span > < span id = "L-227" > < a href = "#L-227" > < span class = "linenos" > 227< / span > < / a > < span class = "sd" > The idea behind this transformation can be seen in Snowflake' s documentation for QUALIFY:< / span >
< / span > < span id = "L-228" > < a href = "#L-228" > < span class = "linenos" > 228< / span > < / a > < span class = "sd" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / span >
< / span > < span id = "L-229" > < a href = "#L-229" > < span class = "linenos" > 229< / span > < / a >
< / span > < span id = "L-230" > < a href = "#L-230" > < span class = "linenos" > 230< / span > < / a > < span class = "sd" > Some dialects don' t support window functions in the WHERE clause, so we need to include them as< / span >
< / span > < span id = "L-231" > < a href = "#L-231" > < span class = "linenos" > 231< / span > < / a > < span class = "sd" > projections in the subquery, in order to refer to them in the outer filter using aliases. Also,< / span >
< / span > < span id = "L-232" > < a href = "#L-232" > < span class = "linenos" > 232< / span > < / a > < span class = "sd" > if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,< / span >
< / span > < span id = "L-233" > < a href = "#L-233" > < span class = "linenos" > 233< / span > < / a > < span class = "sd" > otherwise we won' t be able to refer to it in the outer query' s WHERE clause. Finally, if a< / span >
< / span > < span id = "L-234" > < a href = "#L-234" > < span class = "linenos" > 234< / span > < / a > < span class = "sd" > newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the< / span >
< / span > < span id = "L-235" > < a href = "#L-235" > < span class = "linenos" > 235< / span > < / a > < span class = "sd" > corresponding expression to avoid creating invalid column references.< / span >
< / span > < span id = "L-236" > < a href = "#L-236" > < span class = "linenos" > 236< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-237" > < a href = "#L-237" > < span class = "linenos" > 237< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " qualify" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-238" > < a href = "#L-238" > < span class = "linenos" > 238< / span > < / a > < span class = "n" > taken< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > )< / span >
< / span > < span id = "L-239" > < a href = "#L-239" > < span class = "linenos" > 239< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > :< / span >
< / span > < span id = "L-240" > < a href = "#L-240" > < span class = "linenos" > 240< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > :< / span >
< / span > < span id = "L-241" > < a href = "#L-241" > < span class = "linenos" > 241< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken< / span > < span class = "p" > ,< / span > < span class = "s2" > " _c" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-242" > < a href = "#L-242" > < span class = "linenos" > 242< / span > < / a > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-243" > < a href = "#L-243" > < span class = "linenos" > 243< / span > < / a > < span class = "n" > taken< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-244" > < a href = "#L-244" > < span class = "linenos" > 244< / span > < / a >
< / span > < span id = "L-245" > < a href = "#L-245" > < span class = "linenos" > 245< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _select_alias_or_name< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "o" > |< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > :< / span >
< / span > < span id = "L-246" > < a href = "#L-246" > < span class = "linenos" > 246< / span > < / a > < span class = "n" > alias_or_name< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span >
< / span > < span id = "L-247" > < a href = "#L-247" > < span class = "linenos" > 247< / span > < / a > < span class = "n" > identifier< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-248" > < a href = "#L-248" > < span class = "linenos" > 248< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > identifier< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Identifier< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-249" > < a href = "#L-249" > < span class = "linenos" > 249< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > identifier< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " quoted" < / span > < span class = "p" > ))< / span >
< / span > < span id = "L-250" > < a href = "#L-250" > < span class = "linenos" > 250< / span > < / a > < span class = "k" > return< / span > < span class = "n" > alias_or_name< / span >
< / span > < span id = "L-251" > < a href = "#L-251" > < span class = "linenos" > 251< / span > < / a >
< / span > < span id = "L-252" > < a href = "#L-252" > < span class = "linenos" > 252< / span > < / a > < span class = "n" > outer_selects< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "nb" > map< / span > < span class = "p" > (< / span > < span class = "n" > _select_alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > )))< / span >
< / span > < span id = "L-253" > < a href = "#L-253" > < span class = "linenos" > 253< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " qualify" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-254" > < a href = "#L-254" > < span class = "linenos" > 254< / span > < / a > < span class = "n" > expression_by_alias< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "L-255" > < a href = "#L-255" > < span class = "linenos" > 255< / span > < / a > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-256" > < a href = "#L-256" > < span class = "linenos" > 256< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span >
< / span > < span id = "L-257" > < a href = "#L-257" > < span class = "linenos" > 257< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-258" > < a href = "#L-258" > < span class = "linenos" > 258< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "L-259" > < a href = "#L-259" > < span class = "linenos" > 259< / span > < / a >
< / span > < span id = "L-260" > < a href = "#L-260" > < span class = "linenos" > 260< / span > < / a > < span class = "n" > select_candidates< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > is_star< / span > < span class = "k" > else< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span >
< / span > < span id = "L-261" > < a href = "#L-261" > < span class = "linenos" > 261< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select_candidate< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > qualify_filters< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > select_candidates< / span > < span class = "p" > )):< / span >
< / span > < span id = "L-262" > < a href = "#L-262" > < span class = "linenos" > 262< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-263" > < a href = "#L-263" > < span class = "linenos" > 263< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression_by_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "L-264" > < a href = "#L-264" > < span class = "linenos" > 264< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-265" > < a href = "#L-265" > < span class = "linenos" > 265< / span > < / a > < span class = "n" > expr< / span > < span class = "o" > =< / span > < span class = "n" > expression_by_alias< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-266" > < a href = "#L-266" > < span class = "linenos" > 266< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expr< / span > < span class = "p" > :< / span >
< / span > < span id = "L-267" > < a href = "#L-267" > < span class = "linenos" > 267< / span > < / a > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > expr< / span > < span class = "p" > )< / span >
< / span > < span id = "L-268" > < a href = "#L-268" > < span class = "linenos" > 268< / span > < / a >
< / span > < span id = "L-269" > < a href = "#L-269" > < span class = "linenos" > 269< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > ,< / span > < span class = "s2" > " _w" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-270" > < a href = "#L-270" > < span class = "linenos" > 270< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-271" > < a href = "#L-271" > < span class = "linenos" > 271< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-272" > < a href = "#L-272" > < span class = "linenos" > 272< / span > < / a >
< / span > < span id = "L-273" > < a href = "#L-273" > < span class = "linenos" > 273< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Qualify< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-274" > < a href = "#L-274" > < span class = "linenos" > 274< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "o" > =< / span > < span class = "n" > column< / span >
< / span > < span id = "L-275" > < a href = "#L-275" > < span class = "linenos" > 275< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-276" > < a href = "#L-276" > < span class = "linenos" > 276< / span > < / a > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "p" > )< / span >
< / span > < span id = "L-277" > < a href = "#L-277" > < span class = "linenos" > 277< / span > < / a > < span class = "k" > elif< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > :< / span >
< / span > < span id = "L-278" > < a href = "#L-278" > < span class = "linenos" > 278< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-279" > < a href = "#L-279" > < span class = "linenos" > 279< / span > < / a >
< / span > < span id = "L-280" > < a href = "#L-280" > < span class = "linenos" > 280< / span > < / a > < span class = "k" > return< / span > < span class = "n" > outer_selects< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "s2" > " _t" < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span >
< / span > < span id = "L-281" > < a href = "#L-281" > < span class = "linenos" > 281< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span >
< / span > < span id = "L-282" > < a href = "#L-282" > < span class = "linenos" > 282< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-283" > < a href = "#L-283" > < span class = "linenos" > 283< / span > < / a >
< / span > < span id = "L-284" > < a href = "#L-284" > < span class = "linenos" > 284< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-285" > < a href = "#L-285" > < span class = "linenos" > 285< / span > < / a >
< / span > < span id = "L-286" > < a href = "#L-286" > < span class = "linenos" > 286< / span > < / a >
< / span > < span id = "L-287" > < a href = "#L-287" > < span class = "linenos" > 287< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_precision_parameterized_types< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-288" > < a href = "#L-288" > < span class = "linenos" > 288< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-289" > < a href = "#L-289" > < span class = "linenos" > 289< / span > < / a > < span class = "sd" > Some dialects only allow the precision for parameterized types to be defined in the DDL and not in< / span >
< / span > < span id = "L-290" > < a href = "#L-290" > < span class = "linenos" > 290< / span > < / a > < span class = "sd" > other expressions. This transforms removes the precision from parameterized types in expressions.< / span >
< / span > < span id = "L-291" > < a href = "#L-291" > < span class = "linenos" > 291< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-292" > < a href = "#L-292" > < span class = "linenos" > 292< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-293" > < a href = "#L-293" > < span class = "linenos" > 293< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "L-294" > < a href = "#L-294" > < span class = "linenos" > 294< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > e< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataTypeParam< / span > < span class = "p" > )]< / span >
< / span > < span id = "L-295" > < a href = "#L-295" > < span class = "linenos" > 295< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-296" > < a href = "#L-296" > < span class = "linenos" > 296< / span > < / a >
< / span > < span id = "L-297" > < a href = "#L-297" > < span class = "linenos" > 297< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-298" > < a href = "#L-298" > < span class = "linenos" > 298< / span > < / a >
< / span > < span id = "L-299" > < a href = "#L-299" > < span class = "linenos" > 299< / span > < / a >
< / span > < span id = "L-300" > < a href = "#L-300" > < span class = "linenos" > 300< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unqualify_unnest< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-301" > < a href = "#L-301" > < span class = "linenos" > 301< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Remove references to unnest table aliases, added by the optimizer' s qualify_columns step." " " < / span >
< / span > < span id = "L-302" > < a href = "#L-302" > < span class = "linenos" > 302< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > find_all_in_scope< / span >
< / span > < span id = "L-303" > < a href = "#L-303" > < span class = "linenos" > 303< / span > < / a >
< / span > < span id = "L-304" > < a href = "#L-304" > < span class = "linenos" > 304< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-305" > < a href = "#L-305" > < span class = "linenos" > 305< / span > < / a > < span class = "n" > unnest_aliases< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "L-306" > < a href = "#L-306" > < span class = "linenos" > 306< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span >
< / span > < span id = "L-307" > < a href = "#L-307" > < span class = "linenos" > 307< / span > < / a > < span class = "k" > for< / span > < span class = "n" > unnest< / span > < span class = "ow" > in< / span > < span class = "n" > find_all_in_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > )< / span >
< / span > < span id = "L-308" > < a href = "#L-308" > < span class = "linenos" > 308< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-309" > < a href = "#L-309" > < span class = "linenos" > 309< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "L-310" > < a href = "#L-310" > < span class = "linenos" > 310< / span > < / a > < span class = "k" > if< / span > < span class = "n" > unnest_aliases< / span > < span class = "p" > :< / span >
< / span > < span id = "L-311" > < a href = "#L-311" > < span class = "linenos" > 311< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-312" > < a href = "#L-312" > < span class = "linenos" > 312< / span > < / a > < span class = "n" > leftmost_part< / span > < span class = "o" > =< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > parts< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-313" > < a href = "#L-313" > < span class = "linenos" > 313< / span > < / a > < span class = "k" > if< / span > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > arg_key< / span > < span class = "o" > !=< / span > < span class = "s2" > " this" < / span > < span class = "ow" > and< / span > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > in< / span > < span class = "n" > unnest_aliases< / span > < span class = "p" > :< / span >
< / span > < span id = "L-314" > < a href = "#L-314" > < span class = "linenos" > 314< / span > < / a > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-315" > < a href = "#L-315" > < span class = "linenos" > 315< / span > < / a >
< / span > < span id = "L-316" > < a href = "#L-316" > < span class = "linenos" > 316< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-317" > < a href = "#L-317" > < span class = "linenos" > 317< / span > < / a >
< / span > < span id = "L-318" > < a href = "#L-318" > < span class = "linenos" > 318< / span > < / a >
< / span > < span id = "L-319" > < a href = "#L-319" > < span class = "linenos" > 319< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_to_explode< / span > < span class = "p" > (< / span >
< / span > < span id = "L-320" > < a href = "#L-320" > < span class = "linenos" > 320< / span > < / a > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-321" > < a href = "#L-321" > < span class = "linenos" > 321< / span > < / a > < span class = "n" > unnest_using_arrays_zip< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-322" > < a href = "#L-322" > < span class = "linenos" > 322< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-323" > < a href = "#L-323" > < span class = "linenos" > 323< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert cross join unnest into lateral view explode." " " < / span >
< / span > < span id = "L-324" > < a href = "#L-324" > < span class = "linenos" > 324< / span > < / a >
< / span > < span id = "L-325" > < a href = "#L-325" > < span class = "linenos" > 325< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unnest_zip_exprs< / span > < span class = "p" > (< / span >
< / span > < span id = "L-326" > < a href = "#L-326" > < span class = "linenos" > 326< / span > < / a > < span class = "n" > u< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ,< / span > < span class = "n" > unnest_exprs< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span >
< / span > < span id = "L-327" > < a href = "#L-327" > < span class = "linenos" > 327< / 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 = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-328" > < a href = "#L-328" > < span class = "linenos" > 328< / span > < / a > < span class = "k" > if< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span >
< / span > < span id = "L-329" > < a href = "#L-329" > < span class = "linenos" > 329< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > unnest_using_arrays_zip< / span > < span class = "p" > :< / span >
< / span > < span id = "L-330" > < a href = "#L-330" > < span class = "linenos" > 330< / span > < / a > < span class = "k" > raise< / span > < span class = "n" > UnsupportedError< / span > < span class = "p" > (< / span > < span class = "s2" > " Cannot transpile UNNEST with multiple input arrays" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-331" > < a href = "#L-331" > < span class = "linenos" > 331< / span > < / a >
< / span > < span id = "L-332" > < a href = "#L-332" > < span class = "linenos" > 332< / span > < / a > < span class = "c1" > # Use INLINE(ARRAYS_ZIP(...)) for multiple expressions< / span >
< / span > < span id = "L-333" > < a href = "#L-333" > < span class = "linenos" > 333< / span > < / a > < span class = "n" > zip_exprs< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< / span > < span id = "L-334" > < a href = "#L-334" > < span class = "linenos" > 334< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Anonymous< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "s2" > " ARRAYS_ZIP" < / span > < span class = "p" > ,< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > unnest_exprs< / span > < span class = "p" > )< / span >
< / span > < span id = "L-335" > < a href = "#L-335" > < span class = "linenos" > 335< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "L-336" > < a href = "#L-336" > < span class = "linenos" > 336< / span > < / a > < span class = "n" > u< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > zip_exprs< / span > < span class = "p" > )< / span >
< / span > < span id = "L-337" > < a href = "#L-337" > < span class = "linenos" > 337< / span > < / a > < span class = "k" > return< / span > < span class = "n" > zip_exprs< / span >
< / span > < span id = "L-338" > < a href = "#L-338" > < span class = "linenos" > 338< / span > < / a > < span class = "k" > return< / span > < span class = "n" > unnest_exprs< / span >
< / span > < span id = "L-339" > < a href = "#L-339" > < span class = "linenos" > 339< / span > < / a >
< / span > < span id = "L-340" > < a href = "#L-340" > < span class = "linenos" > 340< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > u< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Type< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Func< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-341" > < a href = "#L-341" > < span class = "linenos" > 341< / span > < / a > < span class = "k" > if< / span > < span class = "n" > u< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " offset" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-342" > < a href = "#L-342" > < span class = "linenos" > 342< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Posexplode< / span >
< / span > < span id = "L-343" > < a href = "#L-343" > < span class = "linenos" > 343< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Inline< / span > < span class = "k" > if< / span > < span class = "n" > has_multi_expr< / span > < span class = "k" > else< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span >
< / span > < span id = "L-344" > < a href = "#L-344" > < span class = "linenos" > 344< / span > < / a >
< / span > < span id = "L-345" > < a href = "#L-345" > < span class = "linenos" > 345< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-346" > < a href = "#L-346" > < span class = "linenos" > 346< / span > < / a > < span class = "n" > from_< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-347" > < a href = "#L-347" > < span class = "linenos" > 347< / span > < / a >
< / span > < span id = "L-348" > < a href = "#L-348" > < span class = "linenos" > 348< / span > < / a > < span class = "k" > if< / span > < span class = "n" > from_< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > from_< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-349" > < a href = "#L-349" > < span class = "linenos" > 349< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > from_< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-350" > < a href = "#L-350" > < span class = "linenos" > 350< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-351" > < a href = "#L-351" > < span class = "linenos" > 351< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-352" > < a href = "#L-352" > < span class = "linenos" > 352< / span > < / a > < span class = "n" > has_multi_expr< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-353" > < a href = "#L-353" > < span class = "linenos" > 353< / span > < / a > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > _unnest_zip_exprs< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )< / span >
< / span > < span id = "L-354" > < a href = "#L-354" > < span class = "linenos" > 354< / span > < / a >
< / span > < span id = "L-355" > < a href = "#L-355" > < span class = "linenos" > 355< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span >
< / span > < span id = "L-356" > < a href = "#L-356" > < span class = "linenos" > 356< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Table< / span > < span class = "p" > (< / span >
< / span > < span id = "L-357" > < a href = "#L-357" > < span class = "linenos" > 357< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )(< / span >
< / span > < span id = "L-358" > < a href = "#L-358" > < span class = "linenos" > 358< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-359" > < a href = "#L-359" > < span class = "linenos" > 359< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > expressions< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-360" > < a href = "#L-360" > < span class = "linenos" > 360< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-361" > < a href = "#L-361" > < span class = "linenos" > 361< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "n" > alias< / span > < span class = "k" > else< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-362" > < a href = "#L-362" > < span class = "linenos" > 362< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-363" > < a href = "#L-363" > < span class = "linenos" > 363< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-364" > < a href = "#L-364" > < span class = "linenos" > 364< / span > < / a >
< / span > < span id = "L-365" > < a href = "#L-365" > < span class = "linenos" > 365< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > []< / span >
< / span > < span id = "L-366" > < a href = "#L-366" > < span class = "linenos" > 366< / span > < / a > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > joins< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-367" > < a href = "#L-367" > < span class = "linenos" > 367< / span > < / a > < span class = "n" > join_expr< / span > < span class = "o" > =< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-368" > < a href = "#L-368" > < span class = "linenos" > 368< / span > < / a >
< / span > < span id = "L-369" > < a href = "#L-369" > < span class = "linenos" > 369< / span > < / a > < span class = "n" > is_lateral< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > join_expr< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lateral< / span > < span class = "p" > )< / span >
< / span > < span id = "L-370" > < a href = "#L-370" > < span class = "linenos" > 370< / span > < / a >
< / span > < span id = "L-371" > < a href = "#L-371" > < span class = "linenos" > 371< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > join_expr< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "k" > if< / span > < span class = "n" > is_lateral< / span > < span class = "k" > else< / span > < span class = "n" > join_expr< / span >
< / span > < span id = "L-372" > < a href = "#L-372" > < span class = "linenos" > 372< / span > < / a >
< / span > < span id = "L-373" > < a href = "#L-373" > < span class = "linenos" > 373< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-374" > < a href = "#L-374" > < span class = "linenos" > 374< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_lateral< / span > < span class = "p" > :< / span >
< / span > < span id = "L-375" > < a href = "#L-375" > < span class = "linenos" > 375< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > join_expr< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-376" > < a href = "#L-376" > < span class = "linenos" > 376< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-377" > < a href = "#L-377" > < span class = "linenos" > 377< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-378" > < a href = "#L-378" > < span class = "linenos" > 378< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-379" > < a href = "#L-379" > < span class = "linenos" > 379< / span > < / a > < span class = "c1" > # The number of unnest.expressions will be changed by _unnest_zip_exprs, we need to record it here< / span >
< / span > < span id = "L-380" > < a href = "#L-380" > < span class = "linenos" > 380< / span > < / a > < span class = "n" > has_multi_expr< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-381" > < a href = "#L-381" > < span class = "linenos" > 381< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > _unnest_zip_exprs< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )< / span >
< / span > < span id = "L-382" > < a href = "#L-382" > < span class = "linenos" > 382< / span > < / a >
< / span > < span id = "L-383" > < a href = "#L-383" > < span class = "linenos" > 383< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > .< / span > < span class = "n" > remove< / span > < span class = "p" > (< / span > < span class = "n" > join< / span > < span class = "p" > )< / span >
< / span > < span id = "L-384" > < a href = "#L-384" > < span class = "linenos" > 384< / span > < / a >
< / span > < span id = "L-385" > < a href = "#L-385" > < span class = "linenos" > 385< / span > < / a > < span class = "n" > alias_cols< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "k" > if< / span > < span class = "n" > alias< / span > < span class = "k" > else< / span > < span class = "p" > []< / span >
< / span > < span id = "L-386" > < a href = "#L-386" > < span class = "linenos" > 386< / span > < / a >
< / span > < span id = "L-387" > < a href = "#L-387" > < span class = "linenos" > 387< / span > < / a > < span class = "c1" > # # Handle UNNEST to LATERAL VIEW EXPLODE: Exception is raised when there are 0 or > 2 aliases< / span >
< / span > < span id = "L-388" > < a href = "#L-388" > < span class = "linenos" > 388< / span > < / a > < span class = "c1" > # Spark LATERAL VIEW EXPLODE requires single alias for array/struct and two for Map type column unlike unnest in trino/presto which can take an arbitrary amount.< / span >
< / span > < span id = "L-389" > < a href = "#L-389" > < span class = "linenos" > 389< / span > < / a > < span class = "c1" > # Refs: https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-lateral-view.html< / span >
< / span > < span id = "L-390" > < a href = "#L-390" > < span class = "linenos" > 390< / span > < / a >
< / span > < span id = "L-391" > < a href = "#L-391" > < span class = "linenos" > 391< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > has_multi_expr< / span > < span class = "ow" > and< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > alias_cols< / span > < span class = "p" > )< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "mi" > 2< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-392" > < a href = "#L-392" > < span class = "linenos" > 392< / span > < / a > < span class = "k" > raise< / span > < span class = "n" > UnsupportedError< / span > < span class = "p" > (< / span >
< / span > < span id = "L-393" > < a href = "#L-393" > < span class = "linenos" > 393< / span > < / a > < span class = "s2" > " CROSS JOIN UNNEST to LATERAL VIEW EXPLODE transformation requires explicit column aliases" < / span >
< / span > < span id = "L-394" > < a href = "#L-394" > < span class = "linenos" > 394< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-395" > < a href = "#L-395" > < span class = "linenos" > 395< / span > < / a >
< / span > < span id = "L-396" > < a href = "#L-396" > < span class = "linenos" > 396< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > alias_cols< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-397" > < a href = "#L-397" > < span class = "linenos" > 397< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span >
< / span > < span id = "L-398" > < a href = "#L-398" > < span class = "linenos" > 398< / span > < / a > < span class = "s2" > " laterals" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-399" > < a href = "#L-399" > < span class = "linenos" > 399< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lateral< / span > < span class = "p" > (< / span >
< / span > < span id = "L-400" > < a href = "#L-400" > < span class = "linenos" > 400< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )(< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > e< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-401" > < a href = "#L-401" > < span class = "linenos" > 401< / span > < / a > < span class = "n" > view< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-402" > < a href = "#L-402" > < span class = "linenos" > 402< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > (< / span >
< / span > < span id = "L-403" > < a href = "#L-403" > < span class = "linenos" > 403< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "c1" > # type: ignore< / span >
< / span > < span id = "L-404" > < a href = "#L-404" > < span class = "linenos" > 404< / span > < / a > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "n" > alias_cols< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-405" > < a href = "#L-405" > < span class = "linenos" > 405< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-406" > < a href = "#L-406" > < span class = "linenos" > 406< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-407" > < a href = "#L-407" > < span class = "linenos" > 407< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-408" > < a href = "#L-408" > < span class = "linenos" > 408< / span > < / a >
< / span > < span id = "L-409" > < a href = "#L-409" > < span class = "linenos" > 409< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-410" > < a href = "#L-410" > < span class = "linenos" > 410< / span > < / a >
< / span > < span id = "L-411" > < a href = "#L-411" > < span class = "linenos" > 411< / span > < / a >
< / span > < span id = "L-412" > < a href = "#L-412" > < span class = "linenos" > 412< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > explode_projection_to_unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "L-413" > < a href = "#L-413" > < span class = "linenos" > 413< / span > < / a > < span class = "n" > index_offset< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-414" > < a href = "#L-414" > < span class = "linenos" > 414< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-415" > < a href = "#L-415" > < span class = "linenos" > 415< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert explode/posexplode projections into unnests." " " < / span >
< / span > < span id = "L-416" > < a href = "#L-416" > < span class = "linenos" > 416< / span > < / a >
< / span > < span id = "L-417" > < a href = "#L-417" > < span class = "linenos" > 417< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _explode_projection_to_unnest< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-418" > < a href = "#L-418" > < span class = "linenos" > 418< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-419" > < a href = "#L-419" > < span class = "linenos" > 419< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > Scope< / span >
< / span > < span id = "L-420" > < a href = "#L-420" > < span class = "linenos" > 420< / span > < / a >
< / span > < span id = "L-421" > < a href = "#L-421" > < span class = "linenos" > 421< / span > < / a > < span class = "n" > taken_select_names< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > )< / span >
< / span > < span id = "L-422" > < a href = "#L-422" > < span class = "linenos" > 422< / span > < / a > < span class = "n" > taken_source_names< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > name< / span > < span class = "k" > for< / span > < span class = "n" > name< / span > < span class = "p" > ,< / span > < span class = "n" > _< / span > < span class = "ow" > in< / span > < span class = "n" > Scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > references< / span > < span class = "p" > }< / span >
< / span > < span id = "L-423" > < a href = "#L-423" > < span class = "linenos" > 423< / span > < / a >
< / span > < span id = "L-424" > < a href = "#L-424" > < span class = "linenos" > 424< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > names< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Set< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ],< / span > < span class = "n" > name< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "p" > :< / span >
< / span > < span id = "L-425" > < a href = "#L-425" > < span class = "linenos" > 425< / span > < / a > < span class = "n" > name< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > names< / span > < span class = "p" > ,< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-426" > < a href = "#L-426" > < span class = "linenos" > 426< / span > < / a > < span class = "n" > names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-427" > < a href = "#L-427" > < span class = "linenos" > 427< / span > < / a > < span class = "k" > return< / span > < span class = "n" > name< / span >
< / span > < span id = "L-428" > < a href = "#L-428" > < span class = "linenos" > 428< / span > < / a >
< / span > < span id = "L-429" > < a href = "#L-429" > < span class = "linenos" > 429< / span > < / a > < span class = "n" > arrays< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "L-430" > < a href = "#L-430" > < span class = "linenos" > 430< / span > < / a > < span class = "n" > series_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-431" > < a href = "#L-431" > < span class = "linenos" > 431< / span > < / a > < span class = "n" > series< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span >
< / span > < span id = "L-432" > < a href = "#L-432" > < span class = "linenos" > 432< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "L-433" > < a href = "#L-433" > < span class = "linenos" > 433< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateSeries< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > index_offset< / span > < span class = "p" > ))]< / span >
< / span > < span id = "L-434" > < a href = "#L-434" > < span class = "linenos" > 434< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-435" > < a href = "#L-435" > < span class = "linenos" > 435< / span > < / a > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_source_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " _u" < / span > < span class = "p" > ),< / span >
< / span > < span id = "L-436" > < a href = "#L-436" > < span class = "linenos" > 436< / span > < / a > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > series_alias< / span > < span class = "p" > ],< / span >
< / span > < span id = "L-437" > < a href = "#L-437" > < span class = "linenos" > 437< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-438" > < a href = "#L-438" > < span class = "linenos" > 438< / span > < / a >
< / span > < span id = "L-439" > < a href = "#L-439" > < span class = "linenos" > 439< / span > < / a > < span class = "c1" > # we use list here because expression.selects is mutated inside the loop< / span >
< / span > < span id = "L-440" > < a href = "#L-440" > < span class = "linenos" > 440< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-441" > < a href = "#L-441" > < span class = "linenos" > 441< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span > < span class = "p" > )< / span >
< / span > < span id = "L-442" > < a href = "#L-442" > < span class = "linenos" > 442< / span > < / a >
< / span > < span id = "L-443" > < a href = "#L-443" > < span class = "linenos" > 443< / span > < / a > < span class = "k" > if< / span > < span class = "n" > explode< / span > < span class = "p" > :< / span >
< / span > < span id = "L-444" > < a href = "#L-444" > < span class = "linenos" > 444< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "s2" > " " < / span >
< / span > < span id = "L-445" > < a href = "#L-445" > < span class = "linenos" > 445< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "s2" > " " < / span >
< / span > < span id = "L-446" > < a href = "#L-446" > < span class = "linenos" > 446< / span > < / a >
< / span > < span id = "L-447" > < a href = "#L-447" > < span class = "linenos" > 447< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-448" > < a href = "#L-448" > < span class = "linenos" > 448< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span >
< / span > < span id = "L-449" > < a href = "#L-449" > < span class = "linenos" > 449< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span >
< / span > < span id = "L-450" > < a href = "#L-450" > < span class = "linenos" > 450< / span > < / a > < span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Aliases< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-451" > < a href = "#L-451" > < span class = "linenos" > 451< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > aliases< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-452" > < a href = "#L-452" > < span class = "linenos" > 452< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > aliases< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-453" > < a href = "#L-453" > < span class = "linenos" > 453< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "s2" > " " < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-454" > < a href = "#L-454" > < span class = "linenos" > 454< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-455" > < a href = "#L-455" > < span class = "linenos" > 455< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "s2" > " " < / span > < span class = "p" > ))< / span >
< / span > < span id = "L-456" > < a href = "#L-456" > < span class = "linenos" > 456< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span > < span class = "p" > )< / span >
< / span > < span id = "L-457" > < a href = "#L-457" > < span class = "linenos" > 457< / span > < / a > < span class = "k" > assert< / span > < span class = "n" > explode< / span >
< / span > < span id = "L-458" > < a href = "#L-458" > < span class = "linenos" > 458< / span > < / a >
< / span > < span id = "L-459" > < a href = "#L-459" > < span class = "linenos" > 459< / span > < / a > < span class = "n" > is_posexplode< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Posexplode< / span > < span class = "p" > )< / span >
< / span > < span id = "L-460" > < a href = "#L-460" > < span class = "linenos" > 460< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "o" > =< / span > < span class = "n" > explode< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-461" > < a href = "#L-461" > < span class = "linenos" > 461< / span > < / a >
< / span > < span id = "L-462" > < a href = "#L-462" > < span class = "linenos" > 462< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ExplodeOuter< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-463" > < a href = "#L-463" > < span class = "linenos" > 463< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > =< / span > < span class = "n" > explode_arg< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-464" > < a href = "#L-464" > < span class = "linenos" > 464< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " safe" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "L-465" > < a href = "#L-465" > < span class = "linenos" > 465< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " offset" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "L-466" > < a href = "#L-466" > < span class = "linenos" > 466< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "L-467" > < a href = "#L-467" > < span class = "linenos" > 467< / span > < / a > < span class = "s2" > " IF" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-468" > < a href = "#L-468" > < span class = "linenos" > 468< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "L-469" > < a href = "#L-469" > < span class = "linenos" > 469< / span > < / a > < span class = "s2" > " ARRAY_SIZE" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span > < span class = "s2" > " COALESCE" < / span > < span class = "p" > ,< / span > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Array< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-470" > < a href = "#L-470" > < span class = "linenos" > 470< / span > < / a > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-471" > < a href = "#L-471" > < span class = "linenos" > 471< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > (< / span > < span class = "n" > bracket< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-472" > < a href = "#L-472" > < span class = "linenos" > 472< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-473" > < a href = "#L-473" > < span class = "linenos" > 473< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-474" > < a href = "#L-474" > < span class = "linenos" > 474< / span > < / a >
< / span > < span id = "L-475" > < a href = "#L-475" > < span class = "linenos" > 475< / span > < / a > < span class = "c1" > # This ensures that we won' t use [POS]EXPLODE' s argument as a new selection< / span >
< / span > < span id = "L-476" > < a href = "#L-476" > < span class = "linenos" > 476< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-477" > < a href = "#L-477" > < span class = "linenos" > 477< / span > < / a > < span class = "n" > taken_select_names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-478" > < a href = "#L-478" > < span class = "linenos" > 478< / span > < / a >
< / span > < span id = "L-479" > < a href = "#L-479" > < span class = "linenos" > 479< / span > < / a > < span class = "n" > unnest_source_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_source_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " _u" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-480" > < a href = "#L-480" > < span class = "linenos" > 480< / span > < / a >
< / span > < span id = "L-481" > < a href = "#L-481" > < span class = "linenos" > 481< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > explode_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "L-482" > < a href = "#L-482" > < span class = "linenos" > 482< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " col" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-483" > < a href = "#L-483" > < span class = "linenos" > 483< / span > < / a >
< / span > < span id = "L-484" > < a href = "#L-484" > < span class = "linenos" > 484< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_posexplode< / span > < span class = "p" > :< / span >
< / span > < span id = "L-485" > < a href = "#L-485" > < span class = "linenos" > 485< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-486" > < a href = "#L-486" > < span class = "linenos" > 486< / span > < / a >
< / span > < span id = "L-487" > < a href = "#L-487" > < span class = "linenos" > 487< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > pos_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "L-488" > < a href = "#L-488" > < span class = "linenos" > 488< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-489" > < a href = "#L-489" > < span class = "linenos" > 489< / span > < / a >
< / span > < span id = "L-490" > < a href = "#L-490" > < span class = "linenos" > 490< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-491" > < a href = "#L-491" > < span class = "linenos" > 491< / span > < / a >
< / span > < span id = "L-492" > < a href = "#L-492" > < span class = "linenos" > 492< / span > < / a > < span class = "n" > series_table_alias< / span > < span class = "o" > =< / span > < span class = "n" > series< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-493" > < a href = "#L-493" > < span class = "linenos" > 493< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > If< / span > < span class = "p" > (< / span >
< / span > < span id = "L-494" > < a href = "#L-494" > < span class = "linenos" > 494< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span >
< / span > < span id = "L-495" > < a href = "#L-495" > < span class = "linenos" > 495< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-496" > < a href = "#L-496" > < span class = "linenos" > 496< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-497" > < a href = "#L-497" > < span class = "linenos" > 497< / span > < / a > < span class = "n" > true< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-498" > < a href = "#L-498" > < span class = "linenos" > 498< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-499" > < a href = "#L-499" > < span class = "linenos" > 499< / span > < / a >
< / span > < span id = "L-500" > < a href = "#L-500" > < span class = "linenos" > 500< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "p" > )< / span >
< / span > < span id = "L-501" > < a href = "#L-501" > < span class = "linenos" > 501< / span > < / a >
< / span > < span id = "L-502" > < a href = "#L-502" > < span class = "linenos" > 502< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_posexplode< / span > < span class = "p" > :< / span >
< / span > < span id = "L-503" > < a href = "#L-503" > < span class = "linenos" > 503< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-504" > < a href = "#L-504" > < span class = "linenos" > 504< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > insert< / span > < span class = "p" > (< / span >
< / span > < span id = "L-505" > < a href = "#L-505" > < span class = "linenos" > 505< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > index< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-506" > < a href = "#L-506" > < span class = "linenos" > 506< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > If< / span > < span class = "p" > (< / span >
< / span > < span id = "L-507" > < a href = "#L-507" > < span class = "linenos" > 507< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span >
< / span > < span id = "L-508" > < a href = "#L-508" > < span class = "linenos" > 508< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-509" > < a href = "#L-509" > < span class = "linenos" > 509< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-510" > < a href = "#L-510" > < span class = "linenos" > 510< / span > < / a > < span class = "n" > true< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-511" > < a href = "#L-511" > < span class = "linenos" > 511< / span > < / a > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > as_< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-512" > < a href = "#L-512" > < span class = "linenos" > 512< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-513" > < a href = "#L-513" > < span class = "linenos" > 513< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "L-514" > < a href = "#L-514" > < span class = "linenos" > 514< / span > < / a >
< / span > < span id = "L-515" > < a href = "#L-515" > < span class = "linenos" > 515< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > arrays< / span > < span class = "p" > :< / span >
< / span > < span id = "L-516" > < a href = "#L-516" > < span class = "linenos" > 516< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-517" > < a href = "#L-517" > < span class = "linenos" > 517< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > join< / span > < span class = "p" > (< / span > < span class = "n" > series< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span > < span class = "n" > join_type< / span > < span class = "o" > =< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-518" > < a href = "#L-518" > < span class = "linenos" > 518< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-519" > < a href = "#L-519" > < span class = "linenos" > 519< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > series< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-520" > < a href = "#L-520" > < span class = "linenos" > 520< / span > < / a >
< / span > < span id = "L-521" > < a href = "#L-521" > < span class = "linenos" > 521< / span > < / a > < span class = "n" > size< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ArraySize< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-522" > < a href = "#L-522" > < span class = "linenos" > 522< / span > < / a > < span class = "n" > arrays< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > size< / span > < span class = "p" > )< / span >
< / span > < span id = "L-523" > < a href = "#L-523" > < span class = "linenos" > 523< / span > < / a >
< / span > < span id = "L-524" > < a href = "#L-524" > < span class = "linenos" > 524< / span > < / a > < span class = "c1" > # trino doesn' t support left join unnest with on conditions< / span >
< / span > < span id = "L-525" > < a href = "#L-525" > < span class = "linenos" > 525< / span > < / a > < span class = "c1" > # if it did, this would be much simpler< / span >
< / span > < span id = "L-526" > < a href = "#L-526" > < span class = "linenos" > 526< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > join< / span > < span class = "p" > (< / span >
< / span > < span id = "L-527" > < a href = "#L-527" > < span class = "linenos" > 527< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span >
< / span > < span id = "L-528" > < a href = "#L-528" > < span class = "linenos" > 528< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "L-529" > < a href = "#L-529" > < span class = "linenos" > 529< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()],< / span >
< / span > < span id = "L-530" > < a href = "#L-530" > < span class = "linenos" > 530< / span > < / a > < span class = "n" > offset< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "L-531" > < a href = "#L-531" > < span class = "linenos" > 531< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-532" > < a href = "#L-532" > < span class = "linenos" > 532< / span > < / a > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-533" > < a href = "#L-533" > < span class = "linenos" > 533< / span > < / a > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ],< / span >
< / span > < span id = "L-534" > < a href = "#L-534" > < span class = "linenos" > 534< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-535" > < a href = "#L-535" > < span class = "linenos" > 535< / span > < / a > < span class = "n" > join_type< / span > < span class = "o" > =< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-536" > < a href = "#L-536" > < span class = "linenos" > 536< / span > < / a > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-537" > < a href = "#L-537" > < span class = "linenos" > 537< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-538" > < a href = "#L-538" > < span class = "linenos" > 538< / span > < / a >
< / span > < span id = "L-539" > < a href = "#L-539" > < span class = "linenos" > 539< / span > < / a > < span class = "k" > if< / span > < span class = "n" > index_offset< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "L-540" > < a href = "#L-540" > < span class = "linenos" > 540< / span > < / a > < span class = "n" > size< / span > < span class = "o" > =< / span > < span class = "n" > size< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-541" > < a href = "#L-541" > < span class = "linenos" > 541< / span > < / a >
< / span > < span id = "L-542" > < a href = "#L-542" > < span class = "linenos" > 542< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span >
< / span > < span id = "L-543" > < a href = "#L-543" > < span class = "linenos" > 543< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "L-544" > < a href = "#L-544" > < span class = "linenos" > 544< / span > < / a > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-545" > < a href = "#L-545" > < span class = "linenos" > 545< / span > < / a > < span class = "o" > .< / span > < span class = "n" > or_< / span > < span class = "p" > (< / span >
< / span > < span id = "L-546" > < a href = "#L-546" > < span class = "linenos" > 546< / span > < / a > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "n" > size< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span >
< / span > < span id = "L-547" > < a href = "#L-547" > < span class = "linenos" > 547< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > size< / span > < span class = "p" > )< / span >
< / span > < span id = "L-548" > < a href = "#L-548" > < span class = "linenos" > 548< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-549" > < a href = "#L-549" > < span class = "linenos" > 549< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "L-550" > < a href = "#L-550" > < span class = "linenos" > 550< / span > < / a > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-551" > < a href = "#L-551" > < span class = "linenos" > 551< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-552" > < a href = "#L-552" > < span class = "linenos" > 552< / span > < / a >
< / span > < span id = "L-553" > < a href = "#L-553" > < span class = "linenos" > 553< / span > < / a > < span class = "k" > if< / span > < span class = "n" > arrays< / span > < span class = "p" > :< / span >
< / span > < span id = "L-554" > < a href = "#L-554" > < span class = "linenos" > 554< / span > < / a > < span class = "n" > end< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Greatest< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > arrays< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > arrays< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :])< / span >
< / span > < span id = "L-555" > < a href = "#L-555" > < span class = "linenos" > 555< / span > < / a >
< / span > < span id = "L-556" > < a href = "#L-556" > < span class = "linenos" > 556< / span > < / a > < span class = "k" > if< / span > < span class = "n" > index_offset< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "L-557" > < a href = "#L-557" > < span class = "linenos" > 557< / span > < / a > < span class = "n" > end< / span > < span class = "o" > =< / span > < span class = "n" > end< / span > < span class = "o" > -< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "o" > -< / span > < span class = "n" > index_offset< / span > < span class = "p" > )< / span >
< / span > < span id = "L-558" > < a href = "#L-558" > < span class = "linenos" > 558< / span > < / a > < span class = "n" > series< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " end" < / span > < span class = "p" > ,< / span > < span class = "n" > end< / span > < span class = "p" > )< / span >
< / span > < span id = "L-559" > < a href = "#L-559" > < span class = "linenos" > 559< / span > < / a >
< / span > < span id = "L-560" > < a href = "#L-560" > < span class = "linenos" > 560< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-561" > < a href = "#L-561" > < span class = "linenos" > 561< / span > < / a >
< / span > < span id = "L-562" > < a href = "#L-562" > < span class = "linenos" > 562< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _explode_projection_to_unnest< / span >
< / span > < span id = "L-563" > < a href = "#L-563" > < span class = "linenos" > 563< / span > < / a >
< / span > < span id = "L-564" > < a href = "#L-564" > < span class = "linenos" > 564< / span > < / a >
< / span > < span id = "L-565" > < a href = "#L-565" > < span class = "linenos" > 565< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > add_within_group_for_percentiles< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-566" > < a href = "#L-566" > < span class = "linenos" > 566< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Transforms percentiles by adding a WITHIN GROUP clause to them." " " < / span >
< / span > < span id = "L-567" > < a href = "#L-567" > < span class = "linenos" > 567< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-568" > < a href = "#L-568" > < span class = "linenos" > 568< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PERCENTILES< / span > < span class = "p" > )< / span >
< / span > < span id = "L-569" > < a href = "#L-569" > < span class = "linenos" > 569< / span > < / a > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > )< / span >
< / span > < span id = "L-570" > < a href = "#L-570" > < span class = "linenos" > 570< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-571" > < a href = "#L-571" > < span class = "linenos" > 571< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-572" > < a href = "#L-572" > < span class = "linenos" > 572< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-573" > < a href = "#L-573" > < span class = "linenos" > 573< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-574" > < a href = "#L-574" > < span class = "linenos" > 574< / span > < / a > < span class = "n" > order< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > column< / span > < span class = "p" > )])< / span >
< / span > < span id = "L-575" > < a href = "#L-575" > < span class = "linenos" > 575< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > order< / span > < span class = "p" > )< / span >
< / span > < span id = "L-576" > < a href = "#L-576" > < span class = "linenos" > 576< / span > < / a >
< / span > < span id = "L-577" > < a href = "#L-577" > < span class = "linenos" > 577< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-578" > < a href = "#L-578" > < span class = "linenos" > 578< / span > < / a >
< / span > < span id = "L-579" > < a href = "#L-579" > < span class = "linenos" > 579< / span > < / a >
< / span > < span id = "L-580" > < a href = "#L-580" > < span class = "linenos" > 580< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_within_group_for_percentiles< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-581" > < a href = "#L-581" > < span class = "linenos" > 581< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause." " " < / span >
< / span > < span id = "L-582" > < a href = "#L-582" > < span class = "linenos" > 582< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-583" > < a href = "#L-583" > < span class = "linenos" > 583< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > )< / span >
< / span > < span id = "L-584" > < a href = "#L-584" > < span class = "linenos" > 584< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PERCENTILES< / span > < span class = "p" > )< / span >
< / span > < span id = "L-585" > < a href = "#L-585" > < span class = "linenos" > 585< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > )< / span >
< / span > < span id = "L-586" > < a href = "#L-586" > < span class = "linenos" > 586< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-587" > < a href = "#L-587" > < span class = "linenos" > 587< / span > < / a > < span class = "n" > quantile< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-588" > < a href = "#L-588" > < span class = "linenos" > 588< / span > < / a > < span class = "n" > input_value< / span > < span class = "o" > =< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > ))< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-589" > < a href = "#L-589" > < span class = "linenos" > 589< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ApproxQuantile< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > input_value< / span > < span class = "p" > ,< / span > < span class = "n" > quantile< / span > < span class = "o" > =< / span > < span class = "n" > quantile< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-590" > < a href = "#L-590" > < span class = "linenos" > 590< / span > < / a >
< / span > < span id = "L-591" > < a href = "#L-591" > < span class = "linenos" > 591< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-592" > < a href = "#L-592" > < span class = "linenos" > 592< / span > < / a >
< / span > < span id = "L-593" > < a href = "#L-593" > < span class = "linenos" > 593< / span > < / a >
< / span > < span id = "L-594" > < a href = "#L-594" > < span class = "linenos" > 594< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > add_recursive_cte_column_names< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-595" > < a href = "#L-595" > < span class = "linenos" > 595< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Uses projection output names in recursive CTE definitions to define the CTEs' columns." " " < / span >
< / span > < span id = "L-596" > < a href = "#L-596" > < span class = "linenos" > 596< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > recursive< / span > < span class = "p" > :< / span >
< / span > < span id = "L-597" > < a href = "#L-597" > < span class = "linenos" > 597< / span > < / a > < span class = "n" > next_name< / span > < span class = "o" > =< / span > < span class = "n" > name_sequence< / span > < span class = "p" > (< / span > < span class = "s2" > " _c_" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-598" > < a href = "#L-598" > < span class = "linenos" > 598< / span > < / a >
< / span > < span id = "L-599" > < a href = "#L-599" > < span class = "linenos" > 599< / span > < / a > < span class = "k" > for< / span > < span class = "n" > cte< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "L-600" > < a href = "#L-600" > < span class = "linenos" > 600< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > :< / span >
< / span > < span id = "L-601" > < a href = "#L-601" > < span class = "linenos" > 601< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-602" > < a href = "#L-602" > < span class = "linenos" > 602< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > query< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > SetOperation< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-603" > < a href = "#L-603" > < span class = "linenos" > 603< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-604" > < a href = "#L-604" > < span class = "linenos" > 604< / span > < / a >
< / span > < span id = "L-605" > < a href = "#L-605" > < span class = "linenos" > 605< / span > < / a > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "L-606" > < a href = "#L-606" > < span class = "linenos" > 606< / span > < / a > < span class = "s2" > " columns" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-607" > < a href = "#L-607" > < span class = "linenos" > 607< / span > < / a > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "ow" > or< / span > < span class = "n" > next_name< / span > < span class = "p" > ())< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > ],< / span >
< / span > < span id = "L-608" > < a href = "#L-608" > < span class = "linenos" > 608< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-609" > < a href = "#L-609" > < span class = "linenos" > 609< / span > < / a >
< / span > < span id = "L-610" > < a href = "#L-610" > < span class = "linenos" > 610< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-611" > < a href = "#L-611" > < span class = "linenos" > 611< / span > < / a >
< / span > < span id = "L-612" > < a href = "#L-612" > < span class = "linenos" > 612< / span > < / a >
< / span > < span id = "L-613" > < a href = "#L-613" > < span class = "linenos" > 613< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > epoch_cast_to_ts< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-614" > < a href = "#L-614" > < span class = "linenos" > 614< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Replace ' epoch' in casts by the equivalent date literal." " " < / span >
< / span > < span id = "L-615" > < a href = "#L-615" > < span class = "linenos" > 615< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-616" > < a href = "#L-616" > < span class = "linenos" > 616< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Cast< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TryCast< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-617" > < a href = "#L-617" > < span class = "linenos" > 617< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ()< / span > < span class = "o" > ==< / span > < span class = "s2" > " epoch" < / span >
< / span > < span id = "L-618" > < a href = "#L-618" > < span class = "linenos" > 618< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > to< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > in< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > TEMPORAL_TYPES< / span >
< / span > < span id = "L-619" > < a href = "#L-619" > < span class = "linenos" > 619< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-620" > < a href = "#L-620" > < span class = "linenos" > 620< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > string< / span > < span class = "p" > (< / span > < span class = "s2" > " 1970-01-01 00:00:00" < / span > < span class = "p" > ))< / span >
< / span > < span id = "L-621" > < a href = "#L-621" > < span class = "linenos" > 621< / span > < / a >
< / span > < span id = "L-622" > < a href = "#L-622" > < span class = "linenos" > 622< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-623" > < a href = "#L-623" > < span class = "linenos" > 623< / span > < / a >
< / span > < span id = "L-624" > < a href = "#L-624" > < span class = "linenos" > 624< / span > < / a >
< / span > < span id = "L-625" > < a href = "#L-625" > < span class = "linenos" > 625< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_semi_and_anti_joins< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-626" > < a href = "#L-626" > < span class = "linenos" > 626< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert SEMI and ANTI joins into equivalent forms that use EXIST instead." " " < / span >
< / span > < span id = "L-627" > < a href = "#L-627" > < span class = "linenos" > 627< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-628" > < a href = "#L-628" > < span class = "linenos" > 628< / span > < / a > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > []:< / span >
< / span > < span id = "L-629" > < a href = "#L-629" > < span class = "linenos" > 629< / span > < / a > < span class = "n" > on< / span > < span class = "o" > =< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-630" > < a href = "#L-630" > < span class = "linenos" > 630< / span > < / a > < span class = "k" > if< / span > < span class = "n" > on< / span > < span class = "ow" > and< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "s2" > " SEMI" < / span > < span class = "p" > ,< / span > < span class = "s2" > " ANTI" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-631" > < a href = "#L-631" > < span class = "linenos" > 631< / span > < / a > < span class = "n" > subquery< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "s2" > " 1" < / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > on< / span > < span class = "p" > )< / span >
< / span > < span id = "L-632" > < a href = "#L-632" > < span class = "linenos" > 632< / span > < / a > < span class = "n" > exists< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > subquery< / span > < span class = "p" > )< / span >
< / span > < span id = "L-633" > < a href = "#L-633" > < span class = "linenos" > 633< / span > < / a > < span class = "k" > if< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "o" > ==< / span > < span class = "s2" > " ANTI" < / span > < span class = "p" > :< / span >
< / span > < span id = "L-634" > < a href = "#L-634" > < span class = "linenos" > 634< / span > < / a > < span class = "n" > exists< / span > < span class = "o" > =< / span > < span class = "n" > exists< / span > < span class = "o" > .< / span > < span class = "n" > not_< / span > < span class = "p" > (< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-635" > < a href = "#L-635" > < span class = "linenos" > 635< / span > < / a >
< / span > < span id = "L-636" > < a href = "#L-636" > < span class = "linenos" > 636< / span > < / a > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-637" > < a href = "#L-637" > < span class = "linenos" > 637< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exists< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-638" > < a href = "#L-638" > < span class = "linenos" > 638< / span > < / a >
< / span > < span id = "L-639" > < a href = "#L-639" > < span class = "linenos" > 639< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-640" > < a href = "#L-640" > < span class = "linenos" > 640< / span > < / a >
< / span > < span id = "L-641" > < a href = "#L-641" > < span class = "linenos" > 641< / span > < / a >
< / span > < span id = "L-642" > < a href = "#L-642" > < span class = "linenos" > 642< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_full_outer_join< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-643" > < a href = "#L-643" > < span class = "linenos" > 643< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-644" > < a href = "#L-644" > < span class = "linenos" > 644< / span > < / a > < span class = "sd" > Converts a query with a FULL OUTER join to a union of identical queries that< / span >
< / span > < span id = "L-645" > < a href = "#L-645" > < span class = "linenos" > 645< / span > < / a > < span class = "sd" > use LEFT/RIGHT OUTER joins instead. This transformation currently only works< / span >
< / span > < span id = "L-646" > < a href = "#L-646" > < span class = "linenos" > 646< / span > < / a > < span class = "sd" > for queries that have a single FULL OUTER join.< / span >
< / span > < span id = "L-647" > < a href = "#L-647" > < span class = "linenos" > 647< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-648" > < a href = "#L-648" > < span class = "linenos" > 648< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-649" > < a href = "#L-649" > < span class = "linenos" > 649< / span > < / a > < span class = "n" > full_outer_joins< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< / span > < span id = "L-650" > < a href = "#L-650" > < span class = "linenos" > 650< / span > < / a > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > join< / span > < span class = "p" > )< / span >
< / span > < span id = "L-651" > < a href = "#L-651" > < span class = "linenos" > 651< / span > < / a > < span class = "k" > for< / span > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > [])< / span >
< / span > < span id = "L-652" > < a href = "#L-652" > < span class = "linenos" > 652< / span > < / a > < span class = "k" > if< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > side< / span > < span class = "o" > ==< / span > < span class = "s2" > " FULL" < / span >
< / span > < span id = "L-653" > < a href = "#L-653" > < span class = "linenos" > 653< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "L-654" > < a href = "#L-654" > < span class = "linenos" > 654< / span > < / a >
< / span > < span id = "L-655" > < a href = "#L-655" > < span class = "linenos" > 655< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > full_outer_joins< / span > < span class = "p" > )< / span > < span class = "o" > ==< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "L-656" > < a href = "#L-656" > < span class = "linenos" > 656< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-657" > < a href = "#L-657" > < span class = "linenos" > 657< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " limit" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "L-658" > < a href = "#L-658" > < span class = "linenos" > 658< / span > < / a > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > =< / span > < span class = "n" > full_outer_joins< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-659" > < a href = "#L-659" > < span class = "linenos" > 659< / span > < / a >
< / span > < span id = "L-660" > < a href = "#L-660" > < span class = "linenos" > 660< / span > < / a > < span class = "n" > tables< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > )< / span >
< / span > < span id = "L-661" > < a href = "#L-661" > < span class = "linenos" > 661< / span > < / a > < span class = "n" > join_conditions< / span > < span class = "o" > =< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span >
< / span > < span id = "L-662" > < a href = "#L-662" > < span class = "linenos" > 662< / span > < / a > < span class = "o" > *< / span > < span class = "p" > [< / span >
< / span > < span id = "L-663" > < a href = "#L-663" > < span class = "linenos" > 663< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "p" > ,< / span > < span class = "n" > tables< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "p" > ,< / span > < span class = "n" > tables< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]))< / span >
< / span > < span id = "L-664" > < a href = "#L-664" > < span class = "linenos" > 664< / span > < / a > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " using" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-665" > < a href = "#L-665" > < span class = "linenos" > 665< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "L-666" > < a href = "#L-666" > < span class = "linenos" > 666< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-667" > < a href = "#L-667" > < span class = "linenos" > 667< / span > < / a >
< / span > < span id = "L-668" > < a href = "#L-668" > < span class = "linenos" > 668< / span > < / a > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " side" < / span > < span class = "p" > ,< / span > < span class = "s2" > " left" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-669" > < a href = "#L-669" > < span class = "linenos" > 669< / span > < / a > < span class = "n" > anti_join_clause< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "s2" > " 1" < / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ])< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > join_conditions< / span > < span class = "p" > )< / span >
< / span > < span id = "L-670" > < a href = "#L-670" > < span class = "linenos" > 670< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ][< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " side" < / span > < span class = "p" > ,< / span > < span class = "s2" > " right" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-671" > < a href = "#L-671" > < span class = "linenos" > 671< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > =< / span > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > anti_join_clause< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > not_< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-672" > < a href = "#L-672" > < span class = "linenos" > 672< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span > < span class = "c1" > # remove CTEs from RIGHT side< / span >
< / span > < span id = "L-673" > < a href = "#L-673" > < span class = "linenos" > 673< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span > < span class = "c1" > # remove order by from LEFT side< / span >
< / span > < span id = "L-674" > < a href = "#L-674" > < span class = "linenos" > 674< / span > < / a >
< / span > < span id = "L-675" > < a href = "#L-675" > < span class = "linenos" > 675< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > union< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > expression_copy< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span > < span class = "n" > distinct< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-676" > < a href = "#L-676" > < span class = "linenos" > 676< / span > < / a >
< / span > < span id = "L-677" > < a href = "#L-677" > < span class = "linenos" > 677< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-678" > < a href = "#L-678" > < span class = "linenos" > 678< / span > < / a >
< / span > < span id = "L-679" > < a href = "#L-679" > < span class = "linenos" > 679< / span > < / a >
< / span > < span id = "L-680" > < a href = "#L-680" > < span class = "linenos" > 680< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_ctes_to_top_level< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > E< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > E< / span > < span class = "p" > :< / span >
< / span > < span id = "L-681" > < a href = "#L-681" > < span class = "linenos" > 681< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-682" > < a href = "#L-682" > < span class = "linenos" > 682< / span > < / a > < span class = "sd" > Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be< / span >
< / span > < span id = "L-683" > < a href = "#L-683" > < span class = "linenos" > 683< / span > < / a > < span class = "sd" > defined at the top-level, so for example queries like:< / span >
< / span > < span id = "L-684" > < a href = "#L-684" > < span class = "linenos" > 684< / span > < / a >
< / span > < span id = "L-685" > < a href = "#L-685" > < span class = "linenos" > 685< / span > < / a > < span class = "sd" > SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq< / span >
< / span > < span id = "L-686" > < a href = "#L-686" > < span class = "linenos" > 686< / span > < / a >
< / span > < span id = "L-687" > < a href = "#L-687" > < span class = "linenos" > 687< / span > < / a > < span class = "sd" > are invalid in those dialects. This transformation can be used to ensure all CTEs are< / span >
< / span > < span id = "L-688" > < a href = "#L-688" > < span class = "linenos" > 688< / span > < / a > < span class = "sd" > moved to the top level so that the final SQL code is valid from a syntax standpoint.< / span >
< / span > < span id = "L-689" > < a href = "#L-689" > < span class = "linenos" > 689< / span > < / a >
< / span > < span id = "L-690" > < a href = "#L-690" > < span class = "linenos" > 690< / span > < / a > < span class = "sd" > TODO: handle name clashes whilst moving CTEs (it can get quite tricky & costly).< / span >
< / span > < span id = "L-691" > < a href = "#L-691" > < span class = "linenos" > 691< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-692" > < a href = "#L-692" > < span class = "linenos" > 692< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-693" > < a href = "#L-693" > < span class = "linenos" > 693< / span > < / a > < span class = "k" > for< / span > < span class = "n" > inner_with< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-694" > < a href = "#L-694" > < span class = "linenos" > 694< / span > < / a > < span class = "k" > if< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "ow" > is< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-695" > < a href = "#L-695" > < span class = "linenos" > 695< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "L-696" > < a href = "#L-696" > < span class = "linenos" > 696< / span > < / a >
< / span > < span id = "L-697" > < a href = "#L-697" > < span class = "linenos" > 697< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > top_level_with< / span > < span class = "p" > :< / span >
< / span > < span id = "L-698" > < a href = "#L-698" > < span class = "linenos" > 698< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-699" > < a href = "#L-699" > < span class = "linenos" > 699< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "p" > )< / span >
< / span > < span id = "L-700" > < a href = "#L-700" > < span class = "linenos" > 700< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-701" > < a href = "#L-701" > < span class = "linenos" > 701< / span > < / a > < span class = "k" > if< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > recursive< / span > < span class = "p" > :< / span >
< / span > < span id = "L-702" > < a href = "#L-702" > < span class = "linenos" > 702< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " recursive" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "L-703" > < a href = "#L-703" > < span class = "linenos" > 703< / span > < / a >
< / span > < span id = "L-704" > < a href = "#L-704" > < span class = "linenos" > 704< / span > < / a > < span class = "n" > parent_cte< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > find_ancestor< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > CTE< / span > < span class = "p" > )< / span >
< / span > < span id = "L-705" > < a href = "#L-705" > < span class = "linenos" > 705< / span > < / a > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-706" > < a href = "#L-706" > < span class = "linenos" > 706< / span > < / a >
< / span > < span id = "L-707" > < a href = "#L-707" > < span class = "linenos" > 707< / span > < / a > < span class = "k" > if< / span > < span class = "n" > parent_cte< / span > < span class = "p" > :< / span >
< / span > < span id = "L-708" > < a href = "#L-708" > < span class = "linenos" > 708< / span > < / a > < span class = "n" > i< / span > < span class = "o" > =< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > index< / span > < span class = "p" > (< / span > < span class = "n" > parent_cte< / span > < span class = "p" > )< / span >
< / span > < span id = "L-709" > < a href = "#L-709" > < span class = "linenos" > 709< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > :< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-710" > < a href = "#L-710" > < span class = "linenos" > 710< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "L-711" > < a href = "#L-711" > < span class = "linenos" > 711< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "L-712" > < a href = "#L-712" > < span class = "linenos" > 712< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "L-713" > < a href = "#L-713" > < span class = "linenos" > 713< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "o" > +< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-714" > < a href = "#L-714" > < span class = "linenos" > 714< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-715" > < a href = "#L-715" > < span class = "linenos" > 715< / span > < / a >
< / span > < span id = "L-716" > < a href = "#L-716" > < span class = "linenos" > 716< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-717" > < a href = "#L-717" > < span class = "linenos" > 717< / span > < / a >
< / span > < span id = "L-718" > < a href = "#L-718" > < span class = "linenos" > 718< / span > < / a >
< / span > < span id = "L-719" > < a href = "#L-719" > < span class = "linenos" > 719< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > ensure_bools< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-720" > < a href = "#L-720" > < span class = "linenos" > 720< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Converts numeric values used in conditions into explicit boolean expressions." " " < / span >
< / span > < span id = "L-721" > < a href = "#L-721" > < span class = "linenos" > 721< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.canonicalize< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > ensure_bools< / span >
< / span > < span id = "L-722" > < a href = "#L-722" > < span class = "linenos" > 722< / span > < / a >
< / span > < span id = "L-723" > < a href = "#L-723" > < span class = "linenos" > 723< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _ensure_bool< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< / span > < span id = "L-724" > < a href = "#L-724" > < span class = "linenos" > 724< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-725" > < a href = "#L-725" > < span class = "linenos" > 725< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > is_number< / span >
< / span > < span id = "L-726" > < a href = "#L-726" > < span class = "linenos" > 726< / span > < / a > < span class = "ow" > or< / span > < span class = "p" > (< / span >
< / span > < span id = "L-727" > < a href = "#L-727" > < span class = "linenos" > 727< / span > < / a > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > SubqueryPredicate< / span > < span class = "p" > )< / span >
< / span > < span id = "L-728" > < a href = "#L-728" > < span class = "linenos" > 728< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > is_type< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > Type< / span > < span class = "o" > .< / span > < span class = "n" > UNKNOWN< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > NUMERIC_TYPES< / span > < span class = "p" > )< / span >
< / span > < span id = "L-729" > < a href = "#L-729" > < span class = "linenos" > 729< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-730" > < a href = "#L-730" > < span class = "linenos" > 730< / span > < / a > < span class = "ow" > or< / span > < span class = "p" > (< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > type< / span > < span class = "p" > )< / span >
< / span > < span id = "L-731" > < a href = "#L-731" > < span class = "linenos" > 731< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-732" > < a href = "#L-732" > < span class = "linenos" > 732< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > neq< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-733" > < a href = "#L-733" > < span class = "linenos" > 733< / span > < / a >
< / span > < span id = "L-734" > < a href = "#L-734" > < span class = "linenos" > 734< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > walk< / span > < span class = "p" > ():< / span >
< / span > < span id = "L-735" > < a href = "#L-735" > < span class = "linenos" > 735< / span > < / a > < span class = "n" > ensure_bools< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > _ensure_bool< / span > < span class = "p" > )< / span >
< / span > < span id = "L-736" > < a href = "#L-736" > < span class = "linenos" > 736< / span > < / a >
< / span > < span id = "L-737" > < a href = "#L-737" > < span class = "linenos" > 737< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-738" > < a href = "#L-738" > < span class = "linenos" > 738< / span > < / a >
< / span > < span id = "L-739" > < a href = "#L-739" > < span class = "linenos" > 739< / span > < / a >
< / span > < span id = "L-740" > < a href = "#L-740" > < span class = "linenos" > 740< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unqualify_columns< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-741" > < a href = "#L-741" > < span class = "linenos" > 741< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-742" > < a href = "#L-742" > < span class = "linenos" > 742< / span > < / a > < span class = "c1" > # We only wanna pop off the table, db, catalog args< / span >
< / span > < span id = "L-743" > < a href = "#L-743" > < span class = "linenos" > 743< / span > < / a > < span class = "k" > for< / span > < span class = "n" > part< / span > < span class = "ow" > in< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > parts< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]:< / span >
< / span > < span id = "L-744" > < a href = "#L-744" > < span class = "linenos" > 744< / span > < / a > < span class = "n" > part< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-745" > < a href = "#L-745" > < span class = "linenos" > 745< / span > < / a >
< / span > < span id = "L-746" > < a href = "#L-746" > < span class = "linenos" > 746< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-747" > < a href = "#L-747" > < span class = "linenos" > 747< / span > < / a >
< / span > < span id = "L-748" > < a href = "#L-748" > < span class = "linenos" > 748< / span > < / a >
< / span > < span id = "L-749" > < a href = "#L-749" > < span class = "linenos" > 749< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_unique_constraints< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-750" > < a href = "#L-750" > < span class = "linenos" > 750< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "L-751" > < a href = "#L-751" > < span class = "linenos" > 751< / span > < / a > < span class = "k" > for< / span > < span class = "n" > constraint< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > UniqueColumnConstraint< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-752" > < a href = "#L-752" > < span class = "linenos" > 752< / span > < / a > < span class = "k" > if< / span > < span class = "n" > constraint< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > :< / span >
< / span > < span id = "L-753" > < a href = "#L-753" > < span class = "linenos" > 753< / span > < / a > < span class = "n" > constraint< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-754" > < a href = "#L-754" > < span class = "linenos" > 754< / span > < / a >
< / span > < span id = "L-755" > < a href = "#L-755" > < span class = "linenos" > 755< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-756" > < a href = "#L-756" > < span class = "linenos" > 756< / span > < / a >
< / span > < span id = "L-757" > < a href = "#L-757" > < span class = "linenos" > 757< / span > < / a >
< / span > < span id = "L-758" > < a href = "#L-758" > < span class = "linenos" > 758< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > ctas_with_tmp_tables_to_create_tmp_view< / span > < span class = "p" > (< / span >
< / span > < span id = "L-759" > < a href = "#L-759" > < span class = "linenos" > 759< / span > < / a > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-760" > < a href = "#L-760" > < span class = "linenos" > 760< / span > < / a > < span class = "n" > tmp_storage_provider< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "k" > lambda< / span > < span class = "n" > e< / span > < span class = "p" > :< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-761" > < a href = "#L-761" > < span class = "linenos" > 761< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-762" > < a href = "#L-762" > < span class = "linenos" > 762< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "L-763" > < a href = "#L-763" > < span class = "linenos" > 763< / span > < / a > < span class = "n" > properties< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " properties" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-764" > < a href = "#L-764" > < span class = "linenos" > 764< / span > < / a > < span class = "n" > temporary< / span > < span class = "o" > =< / span > < span class = "nb" > any< / span > < span class = "p" > (< / span >
< / span > < span id = "L-765" > < a href = "#L-765" > < span class = "linenos" > 765< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TemporaryProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "L-766" > < a href = "#L-766" > < span class = "linenos" > 766< / span > < / a > < span class = "k" > for< / span > < span class = "n" > prop< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "n" > properties< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > properties< / span > < span class = "k" > else< / span > < span class = "p" > [])< / span >
< / span > < span id = "L-767" > < a href = "#L-767" > < span class = "linenos" > 767< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-768" > < a href = "#L-768" > < span class = "linenos" > 768< / span > < / a >
< / span > < span id = "L-769" > < a href = "#L-769" > < span class = "linenos" > 769< / span > < / a > < span class = "c1" > # CTAS with temp tables map to CREATE TEMPORARY VIEW< / span >
< / span > < span id = "L-770" > < a href = "#L-770" > < span class = "linenos" > 770< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "o" > ==< / span > < span class = "s2" > " TABLE" < / span > < span class = "ow" > and< / span > < span class = "n" > temporary< / span > < span class = "p" > :< / span >
< / span > < span id = "L-771" > < a href = "#L-771" > < span class = "linenos" > 771< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-772" > < a href = "#L-772" > < span class = "linenos" > 772< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > (< / span >
< / span > < span id = "L-773" > < a href = "#L-773" > < span class = "linenos" > 773< / span > < / a > < span class = "n" > kind< / span > < span class = "o" > =< / span > < span class = "s2" > " TEMPORARY VIEW" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-774" > < a href = "#L-774" > < span class = "linenos" > 774< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-775" > < a href = "#L-775" > < span class = "linenos" > 775< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-776" > < a href = "#L-776" > < span class = "linenos" > 776< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-777" > < a href = "#L-777" > < span class = "linenos" > 777< / span > < / a > < span class = "k" > return< / span > < span class = "n" > tmp_storage_provider< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-778" > < a href = "#L-778" > < span class = "linenos" > 778< / span > < / a >
< / span > < span id = "L-779" > < a href = "#L-779" > < span class = "linenos" > 779< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-780" > < a href = "#L-780" > < span class = "linenos" > 780< / span > < / a >
< / span > < span id = "L-781" > < a href = "#L-781" > < span class = "linenos" > 781< / span > < / a >
< / span > < span id = "L-782" > < a href = "#L-782" > < span class = "linenos" > 782< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_schema_columns_to_partitioned_by< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-783" > < a href = "#L-783" > < span class = "linenos" > 783< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-784" > < a href = "#L-784" > < span class = "linenos" > 784< / span > < / a > < span class = "sd" > In Hive, the PARTITIONED BY property acts as an extension of a table' s schema. When the< / span >
< / span > < span id = "L-785" > < a href = "#L-785" > < span class = "linenos" > 785< / span > < / a > < span class = "sd" > PARTITIONED BY value is an array of column names, they are transformed into a schema.< / span >
< / span > < span id = "L-786" > < a href = "#L-786" > < span class = "linenos" > 786< / span > < / a > < span class = "sd" > The corresponding columns are removed from the create statement.< / span >
< / span > < span id = "L-787" > < a href = "#L-787" > < span class = "linenos" > 787< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-788" > < a href = "#L-788" > < span class = "linenos" > 788< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "L-789" > < a href = "#L-789" > < span class = "linenos" > 789< / span > < / a > < span class = "n" > has_schema< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > )< / span >
< / span > < span id = "L-790" > < a href = "#L-790" > < span class = "linenos" > 790< / span > < / a > < span class = "n" > is_partitionable< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "ow" > in< / span > < span class = "p" > {< / span > < span class = "s2" > " TABLE" < / span > < span class = "p" > ,< / span > < span class = "s2" > " VIEW" < / span > < span class = "p" > }< / span >
< / span > < span id = "L-791" > < a href = "#L-791" > < span class = "linenos" > 791< / span > < / a >
< / span > < span id = "L-792" > < a href = "#L-792" > < span class = "linenos" > 792< / span > < / a > < span class = "k" > if< / span > < span class = "n" > has_schema< / span > < span class = "ow" > and< / span > < span class = "n" > is_partitionable< / span > < span class = "p" > :< / span >
< / span > < span id = "L-793" > < a href = "#L-793" > < span class = "linenos" > 793< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "L-794" > < a href = "#L-794" > < span class = "linenos" > 794< / span > < / a > < span class = "k" > if< / span > < span class = "n" > prop< / span > < span class = "ow" > and< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-795" > < a href = "#L-795" > < span class = "linenos" > 795< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-796" > < a href = "#L-796" > < span class = "linenos" > 796< / span > < / a > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > v< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > upper< / span > < span class = "p" > ()< / span > < span class = "k" > for< / span > < span class = "n" > v< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > }< / span >
< / span > < span id = "L-797" > < a href = "#L-797" > < span class = "linenos" > 797< / span > < / a > < span class = "n" > partitions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > col< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > upper< / span > < span class = "p" > ()< / span > < span class = "ow" > in< / span > < span class = "n" > columns< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-798" > < a href = "#L-798" > < span class = "linenos" > 798< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > e< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > e< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > partitions< / span > < span class = "p" > ])< / span >
< / span > < span id = "L-799" > < a href = "#L-799" > < span class = "linenos" > 799< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > partitions< / span > < span class = "p" > )))< / span >
< / span > < span id = "L-800" > < a href = "#L-800" > < span class = "linenos" > 800< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > schema< / span > < span class = "p" > )< / span >
< / span > < span id = "L-801" > < a href = "#L-801" > < span class = "linenos" > 801< / span > < / a >
< / span > < span id = "L-802" > < a href = "#L-802" > < span class = "linenos" > 802< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-803" > < a href = "#L-803" > < span class = "linenos" > 803< / span > < / a >
< / span > < span id = "L-804" > < a href = "#L-804" > < span class = "linenos" > 804< / span > < / a >
< / span > < span id = "L-805" > < a href = "#L-805" > < span class = "linenos" > 805< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_partitioned_by_to_schema_columns< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-806" > < a href = "#L-806" > < span class = "linenos" > 806< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-807" > < a href = "#L-807" > < span class = "linenos" > 807< / span > < / a > < span class = "sd" > Spark 3 supports both " HIVEFORMAT" and " DATASOURCE" formats for CREATE TABLE.< / span >
< / span > < span id = "L-808" > < a href = "#L-808" > < span class = "linenos" > 808< / span > < / a >
< / span > < span id = "L-809" > < a href = "#L-809" > < span class = "linenos" > 809< / span > < / a > < span class = "sd" > Currently, SQLGlot uses the DATASOURCE format for Spark 3.< / span >
< / span > < span id = "L-810" > < a href = "#L-810" > < span class = "linenos" > 810< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-811" > < a href = "#L-811" > < span class = "linenos" > 811< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "L-812" > < a href = "#L-812" > < span class = "linenos" > 812< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "L-813" > < a href = "#L-813" > < span class = "linenos" > 813< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-814" > < a href = "#L-814" > < span class = "linenos" > 814< / span > < / a > < span class = "n" > prop< / span >
< / span > < span id = "L-815" > < a href = "#L-815" > < span class = "linenos" > 815< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-816" > < a href = "#L-816" > < span class = "linenos" > 816< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > )< / span >
< / span > < span id = "L-817" > < a href = "#L-817" > < span class = "linenos" > 817< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > all< / span > < span class = "p" > (< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ColumnDef< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "L-818" > < a href = "#L-818" > < span class = "linenos" > 818< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-819" > < a href = "#L-819" > < span class = "linenos" > 819< / span > < / a > < span class = "n" > prop_this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Tuple< / span > < span class = "p" > (< / span >
< / span > < span id = "L-820" > < a href = "#L-820" > < span class = "linenos" > 820< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-821" > < a href = "#L-821" > < span class = "linenos" > 821< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-822" > < a href = "#L-822" > < span class = "linenos" > 822< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-823" > < a href = "#L-823" > < span class = "linenos" > 823< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "L-824" > < a href = "#L-824" > < span class = "linenos" > 824< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "p" > )< / span >
< / span > < span id = "L-825" > < a href = "#L-825" > < span class = "linenos" > 825< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > prop_this< / span > < span class = "p" > )< / span >
< / span > < span id = "L-826" > < a href = "#L-826" > < span class = "linenos" > 826< / span > < / a >
< / span > < span id = "L-827" > < a href = "#L-827" > < span class = "linenos" > 827< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-828" > < a href = "#L-828" > < span class = "linenos" > 828< / span > < / a >
< / span > < span id = "L-829" > < a href = "#L-829" > < span class = "linenos" > 829< / span > < / a >
< / span > < span id = "L-830" > < a href = "#L-830" > < span class = "linenos" > 830< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > struct_kv_to_alias< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-831" > < a href = "#L-831" > < span class = "linenos" > 831< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Converts struct arguments to aliases, e.g. STRUCT(1 AS y)." " " < / span >
< / span > < span id = "L-832" > < a href = "#L-832" > < span class = "linenos" > 832< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Struct< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-833" > < a href = "#L-833" > < span class = "linenos" > 833< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "L-834" > < a href = "#L-834" > < span class = "linenos" > 834< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span >
< / span > < span id = "L-835" > < a href = "#L-835" > < span class = "linenos" > 835< / span > < / a > < span class = "p" > [< / span >
< / span > < span id = "L-836" > < a href = "#L-836" > < span class = "linenos" > 836< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PropertyEQ< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "n" > e< / span >
< / span > < span id = "L-837" > < a href = "#L-837" > < span class = "linenos" > 837< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-838" > < a href = "#L-838" > < span class = "linenos" > 838< / span > < / a > < span class = "p" > ],< / span >
< / span > < span id = "L-839" > < a href = "#L-839" > < span class = "linenos" > 839< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-840" > < a href = "#L-840" > < span class = "linenos" > 840< / span > < / a >
< / span > < span id = "L-841" > < a href = "#L-841" > < span class = "linenos" > 841< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-842" > < a href = "#L-842" > < span class = "linenos" > 842< / span > < / a >
< / span > < span id = "L-843" > < a href = "#L-843" > < span class = "linenos" > 843< / span > < / a >
< / span > < span id = "L-844" > < a href = "#L-844" > < span class = "linenos" > 844< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_join_marks< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-845" > < a href = "#L-845" > < span class = "linenos" > 845< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178< / span >
< / span > < span id = "L-846" > < a href = "#L-846" > < span class = "linenos" > 846< / span > < / a >
< / span > < span id = "L-847" > < a href = "#L-847" > < span class = "linenos" > 847< / span > < / a > < span class = "sd" > 1. You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-848" > < a href = "#L-848" > < span class = "linenos" > 848< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-849" > < a href = "#L-849" > < span class = "linenos" > 849< / span > < / a > < span class = "sd" > 2. The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.< / span >
< / span > < span id = "L-850" > < a href = "#L-850" > < span class = "linenos" > 850< / span > < / a >
< / span > < span id = "L-851" > < a href = "#L-851" > < span class = "linenos" > 851< / span > < / a > < span class = "sd" > The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-852" > < a href = "#L-852" > < span class = "linenos" > 852< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-853" > < a href = "#L-853" > < span class = "linenos" > 853< / span > < / a > < span class = "sd" > You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.< / span >
< / span > < span id = "L-854" > < a href = "#L-854" > < span class = "linenos" > 854< / span > < / a >
< / span > < span id = "L-855" > < a href = "#L-855" > < span class = "linenos" > 855< / span > < / a > < span class = "sd" > The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.< / span >
< / span > < span id = "L-856" > < a href = "#L-856" > < span class = "linenos" > 856< / span > < / a >
< / span > < span id = "L-857" > < a href = "#L-857" > < span class = "linenos" > 857< / span > < / a > < span class = "sd" > A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.< / span >
< / span > < span id = "L-858" > < a href = "#L-858" > < span class = "linenos" > 858< / span > < / a >
< / span > < span id = "L-859" > < a href = "#L-859" > < span class = "linenos" > 859< / span > < / a > < span class = "sd" > A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-860" > < a href = "#L-860" > < span class = "linenos" > 860< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-861" > < a href = "#L-861" > < span class = "linenos" > 861< / span > < / a > < span class = "sd" > A WHERE condition cannot compare any column marked with the (+) operator with a subquery.< / span >
< / span > < span id = "L-862" > < a href = "#L-862" > < span class = "linenos" > 862< / span > < / a >
< / span > < span id = "L-863" > < a href = "#L-863" > < span class = "linenos" > 863< / span > < / a > < span class = "sd" > -- example with WHERE< / span >
< / span > < span id = "L-864" > < a href = "#L-864" > < span class = "linenos" > 864< / span > < / a > < span class = "sd" > SELECT d.department_name, sum(e.salary) as total_salary< / span >
< / span > < span id = "L-865" > < a href = "#L-865" > < span class = "linenos" > 865< / span > < / a > < span class = "sd" > FROM departments d, employees e< / span >
< / span > < span id = "L-866" > < a href = "#L-866" > < span class = "linenos" > 866< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id< / span >
< / span > < span id = "L-867" > < a href = "#L-867" > < span class = "linenos" > 867< / span > < / a > < span class = "sd" > group by department_name< / span >
< / span > < span id = "L-868" > < a href = "#L-868" > < span class = "linenos" > 868< / span > < / a >
< / span > < span id = "L-869" > < a href = "#L-869" > < span class = "linenos" > 869< / span > < / a > < span class = "sd" > -- example of left correlation in select< / span >
< / span > < span id = "L-870" > < a href = "#L-870" > < span class = "linenos" > 870< / span > < / a > < span class = "sd" > SELECT d.department_name, (< / span >
< / span > < span id = "L-871" > < a href = "#L-871" > < span class = "linenos" > 871< / span > < / a > < span class = "sd" > SELECT SUM(e.salary)< / span >
< / span > < span id = "L-872" > < a href = "#L-872" > < span class = "linenos" > 872< / span > < / a > < span class = "sd" > FROM employees e< / span >
< / span > < span id = "L-873" > < a href = "#L-873" > < span class = "linenos" > 873< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id) AS total_salary< / span >
< / span > < span id = "L-874" > < a href = "#L-874" > < span class = "linenos" > 874< / span > < / a > < span class = "sd" > FROM departments d;< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-875" > < a href = "#L-875" > < span class = "linenos" > 875< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-876" > < a href = "#L-876" > < span class = "linenos" > 876< / span > < / a > < span class = "sd" > -- example of left correlation in from< / span >
< / span > < span id = "L-877" > < a href = "#L-877" > < span class = "linenos" > 877< / span > < / a > < span class = "sd" > SELECT d.department_name, t.total_salary< / span >
< / span > < span id = "L-878" > < a href = "#L-878" > < span class = "linenos" > 878< / span > < / a > < span class = "sd" > FROM departments d, (< / span >
< / span > < span id = "L-879" > < a href = "#L-879" > < span class = "linenos" > 879< / span > < / a > < span class = "sd" > SELECT SUM(e.salary) AS total_salary< / span >
< / span > < span id = "L-880" > < a href = "#L-880" > < span class = "linenos" > 880< / span > < / a > < span class = "sd" > FROM employees e< / span >
< / span > < span id = "L-881" > < a href = "#L-881" > < span class = "linenos" > 881< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id< / span >
< / span > < span id = "L-882" > < a href = "#L-882" > < span class = "linenos" > 882< / span > < / a > < span class = "sd" > ) t< / span >
< / span > < span id = "L-883" > < a href = "#L-883" > < span class = "linenos" > 883< / span > < / a > < span class = "sd" > " " " < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-884" > < a href = "#L-884" > < span class = "linenos" > 884< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-885" > < a href = "#L-885" > < span class = "linenos" > 885< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > traverse_scope< / span >
< / span > < span id = "L-886" > < a href = "#L-886" > < span class = "linenos" > 886< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.normalize< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > normalize< / span > < span class = "p" > ,< / span > < span class = "n" > normalized< / span >
< / span > < span id = "L-887" > < a href = "#L-887" > < span class = "linenos" > 887< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > collections< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > defaultdict< / span >
< / span > < span id = "L-888" > < a href = "#L-888" > < span class = "linenos" > 888< / span > < / a >
< / span > < span id = "L-889" > < a href = "#L-889" > < span class = "linenos" > 889< / span > < / a > < span class = "c1" > # we go in reverse to check the main query for left correlation< / span >
< / span > < span id = "L-890" > < a href = "#L-890" > < span class = "linenos" > 890< / span > < / a > < span class = "k" > for< / span > < span class = "n" > scope< / span > < span class = "ow" > in< / span > < span class = "nb" > reversed< / span > < span class = "p" > (< / span > < span class = "n" > traverse_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )):< / span >
< / span > < span id = "L-891" > < a href = "#L-891" > < span class = "linenos" > 891< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > scope< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-892" > < a href = "#L-892" > < span class = "linenos" > 892< / span > < / a >
< / span > < span id = "L-893" > < a href = "#L-893" > < span class = "linenos" > 893< / span > < / a > < span class = "n" > where< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " where" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-894" > < a href = "#L-894" > < span class = "linenos" > 894< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ,< / span > < span class = "p" > [])< / span >
< / span > < span id = "L-895" > < a href = "#L-895" > < span class = "linenos" > 895< / span > < / a >
< / span > < span id = "L-896" > < a href = "#L-896" > < span class = "linenos" > 896< / span > < / a > < span class = "c1" > # knockout: we do not support left correlation (see point 2)< / span >
< / span > < span id = "L-897" > < a href = "#L-897" > < span class = "linenos" > 897< / span > < / a > < span class = "k" > assert< / span > < span class = "ow" > not< / span > < span class = "n" > scope< / span > < span class = "o" > .< / span > < span class = "n" > is_correlated_subquery< / span > < span class = "p" > ,< / span > < span class = "s2" > " Correlated queries are not supported" < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-898" > < a href = "#L-898" > < span class = "linenos" > 898< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-899" > < a href = "#L-899" > < span class = "linenos" > 899< / span > < / a > < span class = "c1" > # nothing to do - we check it here after knockout above< / span >
< / span > < span id = "L-900" > < a href = "#L-900" > < span class = "linenos" > 900< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > where< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > any< / span > < span class = "p" > (< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > c< / span > < span class = "ow" > in< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )):< / span >
< / span > < span id = "L-901" > < a href = "#L-901" > < span class = "linenos" > 901< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "L-902" > < a href = "#L-902" > < span class = "linenos" > 902< / span > < / a >
< / span > < span id = "L-903" > < a href = "#L-903" > < span class = "linenos" > 903< / span > < / a > < span class = "c1" > # make sure we have AND of ORs to have clear join terms< / span >
< / span > < span id = "L-904" > < a href = "#L-904" > < span class = "linenos" > 904< / span > < / a > < span class = "n" > where< / span > < span class = "o" > =< / span > < span class = "n" > normalize< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span >
< / span > < span id = "L-905" > < a href = "#L-905" > < span class = "linenos" > 905< / span > < / a > < span class = "k" > assert< / span > < span class = "n" > normalized< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "p" > ),< / span > < span class = "s2" > " Cannot normalize JOIN predicates" < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-906" > < a href = "#L-906" > < span class = "linenos" > 906< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-907" > < a href = "#L-907" > < span class = "linenos" > 907< / span > < / a > < span class = "n" > joins_ons< / span > < span class = "o" > =< / span > < span class = "n" > defaultdict< / span > < span class = "p" > (< / span > < span class = "nb" > list< / span > < span class = "p" > )< / span > < span class = "c1" > # dict of {name: list of join AND conditions}< / span >
< / span > < span id = "L-908" > < a href = "#L-908" > < span class = "linenos" > 908< / span > < / a > < span class = "k" > for< / span > < span class = "n" > cond< / span > < span class = "ow" > in< / span > < span class = "p" > [< / span > < span class = "n" > where< / span > < span class = "p" > ]< / span > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > And< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ():< / span >
< / span > < span id = "L-909" > < a href = "#L-909" > < span class = "linenos" > 909< / span > < / a > < span class = "n" > join_cols< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > col< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > cond< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > )]< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-910" > < a href = "#L-910" > < span class = "linenos" > 910< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-911" > < a href = "#L-911" > < span class = "linenos" > 911< / span > < / a > < span class = "n" > left_join_table< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > table< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > join_cols< / span > < span class = "p" > )< / span >
< / span > < span id = "L-912" > < a href = "#L-912" > < span class = "linenos" > 912< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > left_join_table< / span > < span class = "p" > :< / span >
< / span > < span id = "L-913" > < a href = "#L-913" > < span class = "linenos" > 913< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "L-914" > < a href = "#L-914" > < span class = "linenos" > 914< / span > < / a >
< / span > < span id = "L-915" > < a href = "#L-915" > < span class = "linenos" > 915< / span > < / a > < span class = "k" > assert< / span > < span class = "ow" > not< / span > < span class = "p" > (< / span >
< / span > < span id = "L-916" > < a href = "#L-916" > < span class = "linenos" > 916< / span > < / a > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > left_join_table< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-917" > < a href = "#L-917" > < span class = "linenos" > 917< / span > < / a > < span class = "p" > ),< / span > < span class = "s2" > " Cannot combine JOIN predicates from different tables" < / span >
< / span > < span id = "L-918" > < a href = "#L-918" > < span class = "linenos" > 918< / span > < / a >
< / span > < span id = "L-919" > < a href = "#L-919" > < span class = "linenos" > 919< / span > < / a > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > join_cols< / span > < span class = "p" > :< / span >
< / span > < span id = "L-920" > < a href = "#L-920" > < span class = "linenos" > 920< / span > < / a > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > ,< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-921" > < a href = "#L-921" > < span class = "linenos" > 921< / span > < / a >
< / span > < span id = "L-922" > < a href = "#L-922" > < span class = "linenos" > 922< / span > < / a > < span class = "n" > joins_ons< / span > < span class = "p" > [< / span > < span class = "n" > left_join_table< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()]< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > cond< / span > < span class = "p" > )< / span >
< / span > < span id = "L-923" > < a href = "#L-923" > < span class = "linenos" > 923< / span > < / a >
< / span > < span id = "L-924" > < a href = "#L-924" > < span class = "linenos" > 924< / span > < / a > < span class = "n" > old_joins< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > :< / span > < span class = "n" > join< / span > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "n" > joins< / span > < span class = "p" > }< / span >
< / span > < span id = "L-925" > < a href = "#L-925" > < span class = "linenos" > 925< / span > < / a > < span class = "n" > new_joins< / span > < span class = "o" > =< / span > < span class = "p" > {}< / span >
< / span > < span id = "L-926" > < a href = "#L-926" > < span class = "linenos" > 926< / span > < / a > < span class = "n" > query_from< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-927" > < a href = "#L-927" > < span class = "linenos" > 927< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-928" > < a href = "#L-928" > < span class = "linenos" > 928< / span > < / a > < span class = "k" > for< / span > < span class = "n" > table< / span > < span class = "p" > ,< / span > < span class = "n" > predicates< / span > < span class = "ow" > in< / span > < span class = "n" > joins_ons< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ():< / span >
< / span > < span id = "L-929" > < a href = "#L-929" > < span class = "linenos" > 929< / span > < / a > < span class = "n" > join_what< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > table< / span > < span class = "p" > ,< / span > < span class = "n" > query_from< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-930" > < a href = "#L-930" > < span class = "linenos" > 930< / span > < / a > < span class = "n" > new_joins< / span > < span class = "p" > [< / span > < span class = "n" > join_what< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > (< / span >
< / span > < span id = "L-931" > < a href = "#L-931" > < span class = "linenos" > 931< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > join_what< / span > < span class = "p" > ,< / span > < span class = "n" > on< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > predicates< / span > < span class = "p" > ),< / span > < span class = "n" > kind< / span > < span class = "o" > =< / span > < span class = "s2" > " LEFT" < / span >
< / span > < span id = "L-932" > < a href = "#L-932" > < span class = "linenos" > 932< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-933" > < a href = "#L-933" > < span class = "linenos" > 933< / span > < / a >
< / span > < span id = "L-934" > < a href = "#L-934" > < span class = "linenos" > 934< / span > < / a > < span class = "k" > for< / span > < span class = "n" > p< / span > < span class = "ow" > in< / span > < span class = "n" > predicates< / span > < span class = "p" > :< / span >
< / span > < span id = "L-935" > < a href = "#L-935" > < span class = "linenos" > 935< / span > < / a > < span class = "k" > while< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Paren< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-936" > < a href = "#L-936" > < span class = "linenos" > 936< / span > < / a > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > p< / span > < span class = "p" > )< / span >
< / span > < span id = "L-937" > < a href = "#L-937" > < span class = "linenos" > 937< / span > < / a >
< / span > < span id = "L-938" > < a href = "#L-938" > < span class = "linenos" > 938< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span >
< / span > < span id = "L-939" > < a href = "#L-939" > < span class = "linenos" > 939< / span > < / a > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-940" > < a href = "#L-940" > < span class = "linenos" > 940< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Binary< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-941" > < a href = "#L-941" > < span class = "linenos" > 941< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > right< / span > < span class = "k" > if< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > left< / span > < span class = "ow" > is< / span > < span class = "kc" > None< / span > < span class = "k" > else< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > left< / span > < span class = "p" > )< / span >
< / span > < span id = "L-942" > < a href = "#L-942" > < span class = "linenos" > 942< / span > < / a > < span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Where< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-943" > < a href = "#L-943" > < span class = "linenos" > 943< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-944" > < a href = "#L-944" > < span class = "linenos" > 944< / span > < / a >
< / span > < span id = "L-945" > < a href = "#L-945" > < span class = "linenos" > 945< / span > < / a > < span class = "k" > if< / span > < span class = "n" > query_from< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "ow" > in< / span > < span class = "n" > new_joins< / span > < span class = "p" > :< / span >
< / span > < span id = "L-946" > < a href = "#L-946" > < span class = "linenos" > 946< / span > < / a > < span class = "n" > only_old_joins< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span > < span class = "o" > -< / span > < span class = "n" > new_joins< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span >
< / span > < span id = "L-947" > < a href = "#L-947" > < span class = "linenos" > 947< / span > < / a > < span class = "k" > assert< / span > < span class = "p" > (< / span >
< / span > < span id = "L-948" > < a href = "#L-948" > < span class = "linenos" > 948< / span > < / a > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > only_old_joins< / span > < span class = "p" > )< / span > < span class = "o" > > =< / span > < span class = "mi" > 1< / span >
< / span > < span id = "L-949" > < a href = "#L-949" > < span class = "linenos" > 949< / span > < / a > < span class = "p" > ),< / span > < span class = "s2" > " Cannot determine which table to use in the new FROM clause" < / span >
< / span > < span id = "L-950" > < a href = "#L-950" > < span class = "linenos" > 950< / span > < / a >
< / span > < span id = "L-951" > < a href = "#L-951" > < span class = "linenos" > 951< / span > < / a > < span class = "n" > new_from_name< / span > < span class = "o" > =< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > only_old_joins< / span > < span class = "p" > )[< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "L-952" > < a href = "#L-952" > < span class = "linenos" > 952< / span > < / a > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "p" > [< / span > < span class = "n" > new_from_name< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-953" > < a href = "#L-953" > < span class = "linenos" > 953< / span > < / a >
< / span > < span id = "L-954" > < a href = "#L-954" > < span class = "linenos" > 954< / span > < / a > < span class = "k" > if< / span > < span class = "n" > new_joins< / span > < span class = "p" > :< / span >
< / span > < span id = "L-955" > < a href = "#L-955" > < span class = "linenos" > 955< / span > < / a > < span class = "k" > for< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > j< / span > < span class = "ow" > in< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ():< / span > < span class = "c1" > # preserve any other joins< / span >
< / span > < span id = "L-956" > < a href = "#L-956" > < span class = "linenos" > 956< / span > < / a > < span class = "k" > if< / span > < span class = "n" > n< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > new_joins< / span > < span class = "ow" > and< / span > < span class = "n" > n< / span > < span class = "o" > !=< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > :< / span >
< / span > < span id = "L-957" > < a href = "#L-957" > < span class = "linenos" > 957< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > j< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "p" > :< / span >
< / span > < span id = "L-958" > < a href = "#L-958" > < span class = "linenos" > 958< / span > < / a > < span class = "n" > j< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " kind" < / span > < span class = "p" > ,< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-959" > < a href = "#L-959" > < span class = "linenos" > 959< / span > < / a > < span class = "n" > new_joins< / span > < span class = "p" > [< / span > < span class = "n" > n< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > j< / span >
< / span > < span id = "L-960" > < a href = "#L-960" > < span class = "linenos" > 960< / span > < / a > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ,< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > new_joins< / span > < span class = "o" > .< / span > < span class = "n" > values< / span > < span class = "p" > ()))< / span >
< / span > < span id = "L-961" > < a href = "#L-961" > < span class = "linenos" > 961< / span > < / a >
< / span > < span id = "L-962" > < a href = "#L-962" > < span class = "linenos" > 962< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-963" > < a href = "#L-963" > < span class = "linenos" > 963< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-964" > < a href = "#L-964" > < span class = "linenos" > 964< / span > < / a >
< / span > < span id = "L-965" > < a href = "#L-965" > < span class = "linenos" > 965< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > any_to_exists< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-966" > < a href = "#L-966" > < span class = "linenos" > 966< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-967" > < a href = "#L-967" > < span class = "linenos" > 967< / span > < / a > < span class = "sd" > Transform ANY operator to Spark' s EXISTS< / span >
< / span > < span id = "L-968" > < a href = "#L-968" > < span class = "linenos" > 968< / span > < / a >
< / span > < span id = "L-969" > < a href = "#L-969" > < span class = "linenos" > 969< / span > < / a > < span class = "sd" > For example,< / span >
< / span > < span id = "L-970" > < a href = "#L-970" > < span class = "linenos" > 970< / span > < / a > < span class = "sd" > - Postgres: SELECT * FROM tbl WHERE 5 > ANY(tbl.col)< / span >
< / span > < span id = "L-971" > < a href = "#L-971" > < span class = "linenos" > 971< / span > < / a > < span class = "sd" > - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -> x < 5)< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-972" > < a href = "#L-972" > < span class = "linenos" > 972< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-973" > < a href = "#L-973" > < span class = "linenos" > 973< / span > < / a > < span class = "sd" > Both ANY and EXISTS accept queries but currently only array expressions are supported for this< / span >
< / span > < span id = "L-974" > < a href = "#L-974" > < span class = "linenos" > 974< / span > < / a > < span class = "sd" > transformation< / span >
< / span > < span id = "L-975" > < a href = "#L-975" > < span class = "linenos" > 975< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-976" > < a href = "#L-976" > < span class = "linenos" > 976< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-977" > < a href = "#L-977" > < span class = "linenos" > 977< / span > < / a > < span class = "k" > for< / span > < span class = "n" > any_expr< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Any< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-978" > < a href = "#L-978" > < span class = "linenos" > 978< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "L-979" > < a href = "#L-979" > < span class = "linenos" > 979< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Query< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-980" > < a href = "#L-980" > < span class = "linenos" > 980< / span > < / a > < span class = "k" > continue< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-981" > < a href = "#L-981" > < span class = "linenos" > 981< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-982" > < a href = "#L-982" > < span class = "linenos" > 982< / span > < / a > < span class = "n" > binop< / span > < span class = "o" > =< / span > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span >
< / span > < span id = "L-983" > < a href = "#L-983" > < span class = "linenos" > 983< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > binop< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Binary< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-984" > < a href = "#L-984" > < span class = "linenos" > 984< / span > < / a > < span class = "n" > lambda_arg< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "s2" > " x" < / span > < span class = "p" > )< / span >
< / span > < span id = "L-985" > < a href = "#L-985" > < span class = "linenos" > 985< / span > < / a > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > lambda_arg< / span > < span class = "p" > )< / span >
< / span > < span id = "L-986" > < a href = "#L-986" > < span class = "linenos" > 986< / span > < / a > < span class = "n" > lambda_expr< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lambda< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > binop< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > lambda_arg< / span > < span class = "p" > ])< / span >
< / span > < span id = "L-987" > < a href = "#L-987" > < span class = "linenos" > 987< / span > < / a > < span class = "n" > binop< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > unnest< / span > < span class = "p" > (),< / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > lambda_expr< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-988" > < a href = "#L-988" > < span class = "linenos" > 988< / span > < / a >
< / span > < span id = "L-989" > < a href = "#L-989" > < span class = "linenos" > 989< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "L-990" > < a href = "#L-990" > < span class = "linenos" > 990< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "L-991" > < a href = "#L-991" > < span class = "linenos" > 991< / span > < / a >
< / span > < span id = "L-992" > < a href = "#L-992" > < span class = "linenos" > 992< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_window_clause< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "L-993" > < a href = "#L-993" > < span class = "linenos" > 993< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Eliminates the `WINDOW` query clause by inling each named window." " " < / span >
< / span > < span id = "L-994" > < a href = "#L-994" > < span class = "linenos" > 994< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-995" > < a href = "#L-995" > < span class = "linenos" > 995< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > find_all_in_scope< / span >
< / span > < span id = "L-996" > < a href = "#L-996" > < span class = "linenos" > 996< / span > < / a >
< / span > < span id = "L-997" > < a href = "#L-997" > < span class = "linenos" > 997< / span > < / a > < span class = "n" > windows< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ]< / span >
< / span > < span id = "L-998" > < a href = "#L-998" > < span class = "linenos" > 998< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "L-999" > < a href = "#L-999" > < span class = "linenos" > 999< / span > < / a >
< / span > < span id = "L-1000" > < a href = "#L-1000" > < span class = "linenos" > 1000< / span > < / a > < span class = "n" > window_expression< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > {}< / span >
< / span > < span id = "L-1001" > < a href = "#L-1001" > < span class = "linenos" > 1001< / span > < / a >
< / span > < span id = "L-1002" > < a href = "#L-1002" > < span class = "linenos" > 1002< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< / span > < span id = "L-1003" > < a href = "#L-1003" > < span class = "linenos" > 1003< / span > < / a > < span class = "n" > inherited_window< / span > < span class = "o" > =< / span > < span class = "n" > window_expression< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-1004" > < a href = "#L-1004" > < span class = "linenos" > 1004< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > inherited_window< / span > < span class = "p" > :< / span >
< / span > < span id = "L-1005" > < a href = "#L-1005" > < span class = "linenos" > 1005< / span > < / a > < span class = "k" > return< / span >
< / span > < span id = "L-1006" > < a href = "#L-1006" > < span class = "linenos" > 1006< / span > < / a >
< / span > < span id = "L-1007" > < a href = "#L-1007" > < span class = "linenos" > 1007< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "L-1008" > < a href = "#L-1008" > < span class = "linenos" > 1008< / span > < / a > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "s2" > " partition_by" < / span > < span class = "p" > ,< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "s2" > " spec" < / span > < span class = "p" > ):< / span >
< / span > < span id = "L-1009" > < a href = "#L-1009" > < span class = "linenos" > 1009< / span > < / a > < span class = "n" > arg< / span > < span class = "o" > =< / span > < span class = "n" > inherited_window< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > )< / span >
< / span > < span id = "L-1010" > < a href = "#L-1010" > < span class = "linenos" > 1010< / span > < / a > < span class = "k" > if< / span > < span class = "n" > arg< / span > < span class = "p" > :< / span >
< / span > < span id = "L-1011" > < a href = "#L-1011" > < span class = "linenos" > 1011< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-1012" > < a href = "#L-1012" > < span class = "linenos" > 1012< / span > < / a >
< / span > < span id = "L-1013" > < a href = "#L-1013" > < span class = "linenos" > 1013< / span > < / a > < span class = "k" > for< / span > < span class = "n" > window< / span > < span class = "ow" > in< / span > < span class = "n" > windows< / span > < span class = "p" > :< / span >
< / span > < span id = "L-1014" > < a href = "#L-1014" > < span class = "linenos" > 1014< / span > < / a > < span class = "n" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > )< / span >
< / span > < span id = "L-1015" > < a href = "#L-1015" > < span class = "linenos" > 1015< / span > < / a > < span class = "n" > window_expression< / span > < span class = "p" > [< / span > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ()]< / span > < span class = "o" > =< / span > < span class = "n" > window< / span >
< / span > < span id = "L-1016" > < a href = "#L-1016" > < span class = "linenos" > 1016< / span > < / a >
< / span > < span id = "L-1017" > < a href = "#L-1017" > < span class = "linenos" > 1017< / span > < / a > < span class = "k" > for< / span > < span class = "n" > window< / span > < span class = "ow" > in< / span > < span class = "n" > find_all_in_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-1018" > < a href = "#L-1018" > < span class = "linenos" > 1018< / span > < / a > < span class = "n" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > )< / span >
< / span > < span id = "L-1019" > < a href = "#L-1019" > < span class = "linenos" > 1019< / span > < / a >
< / span > < span id = "L-1020" > < a href = "#L-1020" > < span class = "linenos" > 1020< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:23:26 +01:00
< / span > < / pre > < / div >
< / section >
2025-02-13 21:41:14 +01:00
< section id = "preprocess" >
< input id = "preprocess-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > preprocess< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > transforms< / span > < span class = "p" > :< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ],< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ]]< / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > < a href = "generator.html#Generator" > sqlglot.generator.Generator< / a > < / span > < span class = "p" > ,< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ],< / span > < span class = "nb" > str< / span > < span class = "p" > ]< / span > :< / span > < / span >
< label class = "view-source-button" for = "preprocess-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#preprocess" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "preprocess-16" > < a href = "#preprocess-16" > < span class = "linenos" > 16< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > preprocess< / span > < span class = "p" > (< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "preprocess-17" > < a href = "#preprocess-17" > < span class = "linenos" > 17< / span > < / a > < span class = "n" > transforms< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]],< / span >
< / span > < span id = "preprocess-18" > < a href = "#preprocess-18" > < span class = "linenos" > 18< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > Generator< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "nb" > str< / span > < span class = "p" > ]:< / span >
< / span > < span id = "preprocess-19" > < a href = "#preprocess-19" > < span class = "linenos" > 19< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "preprocess-20" > < a href = "#preprocess-20" > < span class = "linenos" > 20< / span > < / a > < span class = "sd" > Creates a new transform by chaining a sequence of transformations and converts the resulting< / span >
< / span > < span id = "preprocess-21" > < a href = "#preprocess-21" > < span class = "linenos" > 21< / span > < / a > < span class = "sd" > expression to SQL, using either the " _sql" method corresponding to the resulting expression,< / span >
< / span > < span id = "preprocess-22" > < a href = "#preprocess-22" > < span class = "linenos" > 22< / span > < / a > < span class = "sd" > or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).< / span >
< / span > < span id = "preprocess-23" > < a href = "#preprocess-23" > < span class = "linenos" > 23< / span > < / a >
< / span > < span id = "preprocess-24" > < a href = "#preprocess-24" > < span class = "linenos" > 24< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "preprocess-25" > < a href = "#preprocess-25" > < span class = "linenos" > 25< / span > < / a > < span class = "sd" > transforms: sequence of transform functions. These will be called in order.< / span >
< / span > < span id = "preprocess-26" > < a href = "#preprocess-26" > < span class = "linenos" > 26< / span > < / a >
< / span > < span id = "preprocess-27" > < a href = "#preprocess-27" > < span class = "linenos" > 27< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "preprocess-28" > < a href = "#preprocess-28" > < span class = "linenos" > 28< / span > < / a > < span class = "sd" > Function that can be used as a generator transform.< / span >
< / span > < span id = "preprocess-29" > < a href = "#preprocess-29" > < span class = "linenos" > 29< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "preprocess-30" > < a href = "#preprocess-30" > < span class = "linenos" > 30< / span > < / a >
2025-02-13 21:59:50 +01:00
< / span > < span id = "preprocess-31" > < a href = "#preprocess-31" > < span class = "linenos" > 31< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _to_sql< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "p" > :< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "preprocess-32" > < a href = "#preprocess-32" > < span class = "linenos" > 32< / span > < / a > < span class = "n" > expression_type< / span > < span class = "o" > =< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-33" > < a href = "#preprocess-33" > < span class = "linenos" > 33< / span > < / a >
< / span > < span id = "preprocess-34" > < a href = "#preprocess-34" > < span class = "linenos" > 34< / span > < / a > < span class = "k" > try< / span > < span class = "p" > :< / span >
< / span > < span id = "preprocess-35" > < a href = "#preprocess-35" > < span class = "linenos" > 35< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > transforms< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ](< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-36" > < a href = "#preprocess-36" > < span class = "linenos" > 36< / span > < / a > < span class = "k" > for< / span > < span class = "n" > transform< / span > < span class = "ow" > in< / span > < span class = "n" > transforms< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :]:< / span >
< / span > < span id = "preprocess-37" > < a href = "#preprocess-37" > < span class = "linenos" > 37< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > transform< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-38" > < a href = "#preprocess-38" > < span class = "linenos" > 38< / span > < / a > < span class = "k" > except< / span > < span class = "n" > UnsupportedError< / span > < span class = "k" > as< / span > < span class = "n" > unsupported_error< / span > < span class = "p" > :< / span >
< / span > < span id = "preprocess-39" > < a href = "#preprocess-39" > < span class = "linenos" > 39< / span > < / a > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > unsupported< / span > < span class = "p" > (< / span > < span class = "nb" > str< / span > < span class = "p" > (< / span > < span class = "n" > unsupported_error< / span > < span class = "p" > ))< / span >
< / span > < span id = "preprocess-40" > < a href = "#preprocess-40" > < span class = "linenos" > 40< / span > < / a >
< / span > < span id = "preprocess-41" > < a href = "#preprocess-41" > < span class = "linenos" > 41< / span > < / a > < span class = "n" > _sql_handler< / span > < span class = "o" > =< / span > < span class = "nb" > getattr< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > key< / span > < span class = "o" > +< / span > < span class = "s2" > " _sql" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-42" > < a href = "#preprocess-42" > < span class = "linenos" > 42< / span > < / a > < span class = "k" > if< / span > < span class = "n" > _sql_handler< / span > < span class = "p" > :< / span >
< / span > < span id = "preprocess-43" > < a href = "#preprocess-43" > < span class = "linenos" > 43< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _sql_handler< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-44" > < a href = "#preprocess-44" > < span class = "linenos" > 44< / span > < / a >
< / span > < span id = "preprocess-45" > < a href = "#preprocess-45" > < span class = "linenos" > 45< / span > < / a > < span class = "n" > transforms_handler< / span > < span class = "o" > =< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > TRANSFORMS< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ))< / span >
< / span > < span id = "preprocess-46" > < a href = "#preprocess-46" > < span class = "linenos" > 46< / span > < / a > < span class = "k" > if< / span > < span class = "n" > transforms_handler< / span > < span class = "p" > :< / span >
< / span > < span id = "preprocess-47" > < a href = "#preprocess-47" > < span class = "linenos" > 47< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression_type< / span > < span class = "ow" > is< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ):< / span >
< / span > < span id = "preprocess-48" > < a href = "#preprocess-48" > < span class = "linenos" > 48< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Func< / span > < span class = "p" > ):< / span >
< / span > < span id = "preprocess-49" > < a href = "#preprocess-49" > < span class = "linenos" > 49< / span > < / a > < span class = "k" > return< / span > < span class = "bp" > self< / span > < span class = "o" > .< / span > < span class = "n" > function_fallback_sql< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-50" > < a href = "#preprocess-50" > < span class = "linenos" > 50< / span > < / a >
< / span > < span id = "preprocess-51" > < a href = "#preprocess-51" > < span class = "linenos" > 51< / span > < / a > < span class = "c1" > # Ensures we don' t enter an infinite loop. This can happen when the original expression< / span >
< / span > < span id = "preprocess-52" > < a href = "#preprocess-52" > < span class = "linenos" > 52< / span > < / a > < span class = "c1" > # has the same type as the final expression and there' s no _sql method available for it,< / span >
< / span > < span id = "preprocess-53" > < a href = "#preprocess-53" > < span class = "linenos" > 53< / span > < / a > < span class = "c1" > # because then it' d re-enter _to_sql.< / span >
< / span > < span id = "preprocess-54" > < a href = "#preprocess-54" > < span class = "linenos" > 54< / span > < / a > < span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< / span > < span id = "preprocess-55" > < a href = "#preprocess-55" > < span class = "linenos" > 55< / span > < / a > < span class = "sa" > f< / span > < span class = "s2" > " Expression type < / span > < span class = "si" > {< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "si" > }< / span > < span class = "s2" > requires a _sql method in order to be transformed." < / span >
< / span > < span id = "preprocess-56" > < a href = "#preprocess-56" > < span class = "linenos" > 56< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "preprocess-57" > < a href = "#preprocess-57" > < span class = "linenos" > 57< / span > < / a >
< / span > < span id = "preprocess-58" > < a href = "#preprocess-58" > < span class = "linenos" > 58< / span > < / a > < span class = "k" > return< / span > < span class = "n" > transforms_handler< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-59" > < a href = "#preprocess-59" > < span class = "linenos" > 59< / span > < / a >
< / span > < span id = "preprocess-60" > < a href = "#preprocess-60" > < span class = "linenos" > 60< / span > < / a > < span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unsupported expression type < / span > < span class = "si" > {< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "vm" > __class__< / span > < span class = "o" > .< / span > < span class = "vm" > __name__< / span > < span class = "si" > }< / span > < span class = "s2" > ." < / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-61" > < a href = "#preprocess-61" > < span class = "linenos" > 61< / span > < / a >
< / span > < span id = "preprocess-62" > < a href = "#preprocess-62" > < span class = "linenos" > 62< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _to_sql< / span >
2025-02-13 21:41:14 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Creates a new transform by chaining a sequence of transformations and converts the resulting
expression to SQL, using either the "_sql" method corresponding to the resulting expression,
or the appropriate < code > Generator.TRANSFORMS< / code > function (when applicable -- see below).< / p >
< h6 id = "arguments" > Arguments:< / h6 >
< ul >
< li > < strong > transforms:< / strong > sequence of transform functions. These will be called in order.< / li >
< / ul >
< h6 id = "returns" > Returns:< / h6 >
< blockquote >
< p > Function that can be used as a generator transform.< / p >
< / blockquote >
< / div >
2025-02-13 21:52:32 +01:00
< / section >
< section id = "unnest_generate_date_array_using_recursive_cte" >
< input id = "unnest_generate_date_array_using_recursive_cte-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unnest_generate_date_array_using_recursive_cte< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unnest_generate_date_array_using_recursive_cte-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unnest_generate_date_array_using_recursive_cte" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unnest_generate_date_array_using_recursive_cte-65" > < a href = "#unnest_generate_date_array_using_recursive_cte-65" > < span class = "linenos" > 65< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_generate_date_array_using_recursive_cte< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-66" > < a href = "#unnest_generate_date_array_using_recursive_cte-66" > < span class = "linenos" > 66< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-67" > < a href = "#unnest_generate_date_array_using_recursive_cte-67" > < span class = "linenos" > 67< / span > < / a > < span class = "n" > count< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-68" > < a href = "#unnest_generate_date_array_using_recursive_cte-68" > < span class = "linenos" > 68< / span > < / a > < span class = "n" > recursive_ctes< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-69" > < a href = "#unnest_generate_date_array_using_recursive_cte-69" > < span class = "linenos" > 69< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-70" > < a href = "#unnest_generate_date_array_using_recursive_cte-70" > < span class = "linenos" > 70< / span > < / a > < span class = "k" > for< / span > < span class = "n" > unnest< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-71" > < a href = "#unnest_generate_date_array_using_recursive_cte-71" > < span class = "linenos" > 71< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-72" > < a href = "#unnest_generate_date_array_using_recursive_cte-72" > < span class = "linenos" > 72< / span > < / a > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > ))< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-73" > < a href = "#unnest_generate_date_array_using_recursive_cte-73" > < span class = "linenos" > 73< / span > < / a > < span class = "ow" > or< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-74" > < a href = "#unnest_generate_date_array_using_recursive_cte-74" > < span class = "linenos" > 74< / span > < / a > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateDateArray< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-75" > < a href = "#unnest_generate_date_array_using_recursive_cte-75" > < span class = "linenos" > 75< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-76" > < a href = "#unnest_generate_date_array_using_recursive_cte-76" > < span class = "linenos" > 76< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-77" > < a href = "#unnest_generate_date_array_using_recursive_cte-77" > < span class = "linenos" > 77< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-78" > < a href = "#unnest_generate_date_array_using_recursive_cte-78" > < span class = "linenos" > 78< / span > < / a > < span class = "n" > generate_date_array< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-79" > < a href = "#unnest_generate_date_array_using_recursive_cte-79" > < span class = "linenos" > 79< / span > < / a > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " start" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-80" > < a href = "#unnest_generate_date_array_using_recursive_cte-80" > < span class = "linenos" > 80< / span > < / a > < span class = "n" > end< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " end" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-81" > < a href = "#unnest_generate_date_array_using_recursive_cte-81" > < span class = "linenos" > 81< / span > < / a > < span class = "n" > step< / span > < span class = "o" > =< / span > < span class = "n" > generate_date_array< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " step" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-82" > < a href = "#unnest_generate_date_array_using_recursive_cte-82" > < span class = "linenos" > 82< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-83" > < a href = "#unnest_generate_date_array_using_recursive_cte-83" > < span class = "linenos" > 83< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > start< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "n" > end< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > step< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Interval< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-84" > < a href = "#unnest_generate_date_array_using_recursive_cte-84" > < span class = "linenos" > 84< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-85" > < a href = "#unnest_generate_date_array_using_recursive_cte-85" > < span class = "linenos" > 85< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-86" > < a href = "#unnest_generate_date_array_using_recursive_cte-86" > < span class = "linenos" > 86< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-87" > < a href = "#unnest_generate_date_array_using_recursive_cte-87" > < span class = "linenos" > 87< / span > < / a > < span class = "n" > column_name< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "s2" > " date_value" < / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-88" > < a href = "#unnest_generate_date_array_using_recursive_cte-88" > < span class = "linenos" > 88< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-89" > < a href = "#unnest_generate_date_array_using_recursive_cte-89" > < span class = "linenos" > 89< / span > < / a > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-90" > < a href = "#unnest_generate_date_array_using_recursive_cte-90" > < span class = "linenos" > 90< / span > < / a > < span class = "n" > date_add< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-91" > < a href = "#unnest_generate_date_array_using_recursive_cte-91" > < span class = "linenos" > 91< / span > < / a > < span class = "s2" > " date_add" < / span > < span class = "p" > ,< / span > < span class = "n" > column_name< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > step< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > ),< / span > < span class = "n" > step< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " unit" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-92" > < a href = "#unnest_generate_date_array_using_recursive_cte-92" > < span class = "linenos" > 92< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-93" > < a href = "#unnest_generate_date_array_using_recursive_cte-93" > < span class = "linenos" > 93< / span > < / a > < span class = "n" > cast_date_add< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > date_add< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-94" > < a href = "#unnest_generate_date_array_using_recursive_cte-94" > < span class = "linenos" > 94< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-95" > < a href = "#unnest_generate_date_array_using_recursive_cte-95" > < span class = "linenos" > 95< / span > < / a > < span class = "n" > cte_name< / span > < span class = "o" > =< / span > < span class = "s2" > " _generated_dates" < / span > < span class = "o" > +< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " _< / span > < span class = "si" > {< / span > < span class = "n" > count< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span > < span class = "k" > if< / span > < span class = "n" > count< / span > < span class = "k" > else< / span > < span class = "s2" > " " < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-96" > < a href = "#unnest_generate_date_array_using_recursive_cte-96" > < span class = "linenos" > 96< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-97" > < a href = "#unnest_generate_date_array_using_recursive_cte-97" > < span class = "linenos" > 97< / span > < / a > < span class = "n" > base_query< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "o" > .< / span > < span class = "n" > as_< / span > < span class = "p" > (< / span > < span class = "n" > column_name< / span > < span class = "p" > ))< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-98" > < a href = "#unnest_generate_date_array_using_recursive_cte-98" > < span class = "linenos" > 98< / span > < / a > < span class = "n" > recursive_query< / span > < span class = "o" > =< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-99" > < a href = "#unnest_generate_date_array_using_recursive_cte-99" > < span class = "linenos" > 99< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > cast_date_add< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-100" > < a href = "#unnest_generate_date_array_using_recursive_cte-100" > < span class = "linenos" > 100< / span > < / a > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-101" > < a href = "#unnest_generate_date_array_using_recursive_cte-101" > < span class = "linenos" > 101< / span > < / a > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > cast_date_add< / span > < span class = "o" > < =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > end< / span > < span class = "p" > ,< / span > < span class = "s2" > " date" < / span > < span class = "p" > ))< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-102" > < a href = "#unnest_generate_date_array_using_recursive_cte-102" > < span class = "linenos" > 102< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-103" > < a href = "#unnest_generate_date_array_using_recursive_cte-103" > < span class = "linenos" > 103< / span > < / a > < span class = "n" > cte_query< / span > < span class = "o" > =< / span > < span class = "n" > base_query< / span > < span class = "o" > .< / span > < span class = "n" > union< / span > < span class = "p" > (< / span > < span class = "n" > recursive_query< / span > < span class = "p" > ,< / span > < span class = "n" > distinct< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-104" > < a href = "#unnest_generate_date_array_using_recursive_cte-104" > < span class = "linenos" > 104< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-105" > < a href = "#unnest_generate_date_array_using_recursive_cte-105" > < span class = "linenos" > 105< / span > < / a > < span class = "n" > generate_dates_query< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > column_name< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-106" > < a href = "#unnest_generate_date_array_using_recursive_cte-106" > < span class = "linenos" > 106< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > generate_dates_query< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "n" > cte_name< / span > < span class = "p" > ))< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-107" > < a href = "#unnest_generate_date_array_using_recursive_cte-107" > < span class = "linenos" > 107< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-108" > < a href = "#unnest_generate_date_array_using_recursive_cte-108" > < span class = "linenos" > 108< / span > < / a > < span class = "n" > recursive_ctes< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-109" > < a href = "#unnest_generate_date_array_using_recursive_cte-109" > < span class = "linenos" > 109< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > CTE< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > cte_query< / span > < span class = "p" > ),< / span > < span class = "n" > cte_name< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > column_name< / span > < span class = "p" > ])< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-110" > < a href = "#unnest_generate_date_array_using_recursive_cte-110" > < span class = "linenos" > 110< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-111" > < a href = "#unnest_generate_date_array_using_recursive_cte-111" > < span class = "linenos" > 111< / span > < / a > < span class = "n" > count< / span > < span class = "o" > +=< / span > < span class = "mi" > 1< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-112" > < a href = "#unnest_generate_date_array_using_recursive_cte-112" > < span class = "linenos" > 112< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-113" > < a href = "#unnest_generate_date_array_using_recursive_cte-113" > < span class = "linenos" > 113< / span > < / a > < span class = "k" > if< / span > < span class = "n" > recursive_ctes< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-114" > < a href = "#unnest_generate_date_array_using_recursive_cte-114" > < span class = "linenos" > 114< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > ()< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-115" > < a href = "#unnest_generate_date_array_using_recursive_cte-115" > < span class = "linenos" > 115< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " recursive" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-116" > < a href = "#unnest_generate_date_array_using_recursive_cte-116" > < span class = "linenos" > 116< / span > < / a > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "o" > *< / span > < span class = "n" > recursive_ctes< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > with_expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ])< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-117" > < a href = "#unnest_generate_date_array_using_recursive_cte-117" > < span class = "linenos" > 117< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "n" > with_expression< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-118" > < a href = "#unnest_generate_date_array_using_recursive_cte-118" > < span class = "linenos" > 118< / span > < / a >
< / span > < span id = "unnest_generate_date_array_using_recursive_cte-119" > < a href = "#unnest_generate_date_array_using_recursive_cte-119" > < span class = "linenos" > 119< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:52:32 +01:00
< / span > < / pre > < / div >
< / section >
< section id = "unnest_generate_series" >
< input id = "unnest_generate_series-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unnest_generate_series< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unnest_generate_series-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unnest_generate_series" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unnest_generate_series-122" > < a href = "#unnest_generate_series-122" > < span class = "linenos" > 122< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_generate_series< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "unnest_generate_series-123" > < a href = "#unnest_generate_series-123" > < span class = "linenos" > 123< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Unnests GENERATE_SERIES or SEQUENCE table references." " " < / span >
< / span > < span id = "unnest_generate_series-124" > < a href = "#unnest_generate_series-124" > < span class = "linenos" > 124< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "unnest_generate_series-125" > < a href = "#unnest_generate_series-125" > < span class = "linenos" > 125< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Table< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateSeries< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_generate_series-126" > < a href = "#unnest_generate_series-126" > < span class = "linenos" > 126< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > this< / span > < span class = "p" > ])< / span >
< / span > < span id = "unnest_generate_series-127" > < a href = "#unnest_generate_series-127" > < span class = "linenos" > 127< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_generate_series-128" > < a href = "#unnest_generate_series-128" > < span class = "linenos" > 128< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "s2" > " _u" < / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > ],< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_generate_series-129" > < a href = "#unnest_generate_series-129" > < span class = "linenos" > 129< / span > < / a >
< / span > < span id = "unnest_generate_series-130" > < a href = "#unnest_generate_series-130" > < span class = "linenos" > 130< / span > < / a > < span class = "k" > return< / span > < span class = "n" > unnest< / span >
< / span > < span id = "unnest_generate_series-131" > < a href = "#unnest_generate_series-131" > < span class = "linenos" > 131< / span > < / a >
< / span > < span id = "unnest_generate_series-132" > < a href = "#unnest_generate_series-132" > < span class = "linenos" > 132< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:52:32 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Unnests GENERATE_SERIES or SEQUENCE table references.< / p >
< / div >
2025-02-13 21:41:14 +01:00
< / section >
2025-02-13 15:23:26 +01:00
< section id = "unalias_group" >
< input id = "unalias_group-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unalias_group< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unalias_group-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unalias_group" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unalias_group-135" > < a href = "#unalias_group-135" > < span class = "linenos" > 135< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unalias_group< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "unalias_group-136" > < a href = "#unalias_group-136" > < span class = "linenos" > 136< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "unalias_group-137" > < a href = "#unalias_group-137" > < span class = "linenos" > 137< / span > < / a > < span class = "sd" > Replace references to select aliases in GROUP BY clauses.< / span >
< / span > < span id = "unalias_group-138" > < a href = "#unalias_group-138" > < span class = "linenos" > 138< / span > < / a >
< / span > < span id = "unalias_group-139" > < a href = "#unalias_group-139" > < span class = "linenos" > 139< / span > < / a > < span class = "sd" > Example:< / span >
< / span > < span id = "unalias_group-140" > < a href = "#unalias_group-140" > < span class = "linenos" > 140< / span > < / a > < span class = "sd" > > > > import sqlglot< / span >
< / span > < span id = "unalias_group-141" > < a href = "#unalias_group-141" > < span class = "linenos" > 141< / span > < / a > < span class = "sd" > > > > sqlglot.parse_one(" SELECT a AS b FROM x GROUP BY b" ).transform(unalias_group).sql()< / span >
< / span > < span id = "unalias_group-142" > < a href = "#unalias_group-142" > < span class = "linenos" > 142< / span > < / a > < span class = "sd" > ' SELECT a AS b FROM x GROUP BY 1' < / span >
< / span > < span id = "unalias_group-143" > < a href = "#unalias_group-143" > < span class = "linenos" > 143< / span > < / a >
< / span > < span id = "unalias_group-144" > < a href = "#unalias_group-144" > < span class = "linenos" > 144< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "unalias_group-145" > < a href = "#unalias_group-145" > < span class = "linenos" > 145< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "unalias_group-146" > < a href = "#unalias_group-146" > < span class = "linenos" > 146< / span > < / a >
< / span > < span id = "unalias_group-147" > < a href = "#unalias_group-147" > < span class = "linenos" > 147< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "unalias_group-148" > < a href = "#unalias_group-148" > < span class = "linenos" > 148< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "unalias_group-149" > < a href = "#unalias_group-149" > < span class = "linenos" > 149< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "unalias_group-150" > < a href = "#unalias_group-150" > < span class = "linenos" > 150< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Group< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "unalias_group-151" > < a href = "#unalias_group-151" > < span class = "linenos" > 151< / span > < / a > < span class = "n" > aliased_selects< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "unalias_group-152" > < a href = "#unalias_group-152" > < span class = "linenos" > 152< / span > < / a > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span > < span class = "n" > i< / span >
< / span > < span id = "unalias_group-153" > < a href = "#unalias_group-153" > < span class = "linenos" > 153< / span > < / a > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ,< / span > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span >
< / span > < span id = "unalias_group-154" > < a href = "#unalias_group-154" > < span class = "linenos" > 154< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > )< / span >
< / span > < span id = "unalias_group-155" > < a href = "#unalias_group-155" > < span class = "linenos" > 155< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "unalias_group-156" > < a href = "#unalias_group-156" > < span class = "linenos" > 156< / span > < / a >
< / span > < span id = "unalias_group-157" > < a href = "#unalias_group-157" > < span class = "linenos" > 157< / span > < / a > < span class = "k" > for< / span > < span class = "n" > group_by< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "unalias_group-158" > < a href = "#unalias_group-158" > < span class = "linenos" > 158< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "unalias_group-159" > < a href = "#unalias_group-159" > < span class = "linenos" > 159< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > group_by< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span >
< / span > < span id = "unalias_group-160" > < a href = "#unalias_group-160" > < span class = "linenos" > 160< / span > < / a > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > table< / span >
< / span > < span id = "unalias_group-161" > < a href = "#unalias_group-161" > < span class = "linenos" > 161< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "ow" > in< / span > < span class = "n" > aliased_selects< / span >
< / span > < span id = "unalias_group-162" > < a href = "#unalias_group-162" > < span class = "linenos" > 162< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "unalias_group-163" > < a href = "#unalias_group-163" > < span class = "linenos" > 163< / span > < / a > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > aliased_selects< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > group_by< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > )))< / span >
< / span > < span id = "unalias_group-164" > < a href = "#unalias_group-164" > < span class = "linenos" > 164< / span > < / a >
< / span > < span id = "unalias_group-165" > < a href = "#unalias_group-165" > < span class = "linenos" > 165< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:23:26 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Replace references to select aliases in GROUP BY clauses.< / p >
< h6 id = "example" > Example:< / h6 >
< blockquote >
< div class = "pdoc-code codehilite" >
2025-02-13 21:59:50 +01:00
< pre > < span > < / span > < code > < span class = "gp" > > > > < / span > < span class = "kn" > import< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot< / span >
2025-02-13 15:23:26 +01:00
< span class = "gp" > > > > < / span > < span class = "n" > < a href = "../sqlglot.html#parse_one" > sqlglot.parse_one< / a > < / span > < span class = "p" > (< / span > < span class = "s2" > " SELECT a AS b FROM x GROUP BY b" < / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > transform< / span > < span class = "p" > (< / span > < span class = "n" > unalias_group< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > sql< / span > < span class = "p" > ()< / span >
< span class = "go" > ' SELECT a AS b FROM x GROUP BY 1' < / span >
< / code > < / pre >
< / div >
< / blockquote >
< h6 id = "arguments" > Arguments:< / h6 >
< ul >
< li > < strong > expression:< / strong > the expression that will be transformed.< / li >
< / ul >
< h6 id = "returns" > Returns:< / h6 >
< blockquote >
< p > The transformed expression.< / p >
< / blockquote >
< / div >
< / section >
< section id = "eliminate_distinct_on" >
< input id = "eliminate_distinct_on-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > eliminate_distinct_on< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "eliminate_distinct_on-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#eliminate_distinct_on" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_distinct_on-168" > < a href = "#eliminate_distinct_on-168" > < span class = "linenos" > 168< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_distinct_on< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:55:40 +01:00
< / span > < span id = "eliminate_distinct_on-169" > < a href = "#eliminate_distinct_on-169" > < span class = "linenos" > 169< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_distinct_on-170" > < a href = "#eliminate_distinct_on-170" > < span class = "linenos" > 170< / span > < / a > < span class = "sd" > Convert SELECT DISTINCT ON statements to a subquery with a window function.< / span >
< / span > < span id = "eliminate_distinct_on-171" > < a href = "#eliminate_distinct_on-171" > < span class = "linenos" > 171< / span > < / a >
< / span > < span id = "eliminate_distinct_on-172" > < a href = "#eliminate_distinct_on-172" > < span class = "linenos" > 172< / span > < / a > < span class = "sd" > This is useful for dialects that don' t support SELECT DISTINCT ON but support window functions.< / span >
< / span > < span id = "eliminate_distinct_on-173" > < a href = "#eliminate_distinct_on-173" > < span class = "linenos" > 173< / span > < / a >
< / span > < span id = "eliminate_distinct_on-174" > < a href = "#eliminate_distinct_on-174" > < span class = "linenos" > 174< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "eliminate_distinct_on-175" > < a href = "#eliminate_distinct_on-175" > < span class = "linenos" > 175< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "eliminate_distinct_on-176" > < a href = "#eliminate_distinct_on-176" > < span class = "linenos" > 176< / span > < / a >
< / span > < span id = "eliminate_distinct_on-177" > < a href = "#eliminate_distinct_on-177" > < span class = "linenos" > 177< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "eliminate_distinct_on-178" > < a href = "#eliminate_distinct_on-178" > < span class = "linenos" > 178< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "eliminate_distinct_on-179" > < a href = "#eliminate_distinct_on-179" > < span class = "linenos" > 179< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_distinct_on-180" > < a href = "#eliminate_distinct_on-180" > < span class = "linenos" > 180< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_distinct_on-181" > < a href = "#eliminate_distinct_on-181" > < span class = "linenos" > 181< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-182" > < a href = "#eliminate_distinct_on-182" > < span class = "linenos" > 182< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > )< / span >
2025-02-13 21:57:20 +01:00
< / span > < span id = "eliminate_distinct_on-183" > < a href = "#eliminate_distinct_on-183" > < span class = "linenos" > 183< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > ),< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-184" > < a href = "#eliminate_distinct_on-184" > < span class = "linenos" > 184< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_distinct_on-185" > < a href = "#eliminate_distinct_on-185" > < span class = "linenos" > 185< / span > < / a > < span class = "n" > row_number_window_alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > ,< / span > < span class = "s2" > " _row_number" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-186" > < a href = "#eliminate_distinct_on-186" > < span class = "linenos" > 186< / span > < / a >
< / span > < span id = "eliminate_distinct_on-187" > < a href = "#eliminate_distinct_on-187" > < span class = "linenos" > 187< / span > < / a > < span class = "n" > distinct_cols< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " distinct" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " on" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "eliminate_distinct_on-188" > < a href = "#eliminate_distinct_on-188" > < span class = "linenos" > 188< / span > < / a > < span class = "n" > window< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > RowNumber< / span > < span class = "p" > (),< / span > < span class = "n" > partition_by< / span > < span class = "o" > =< / span > < span class = "n" > distinct_cols< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-189" > < a href = "#eliminate_distinct_on-189" > < span class = "linenos" > 189< / span > < / a >
2025-02-13 21:55:40 +01:00
< / span > < span id = "eliminate_distinct_on-190" > < a href = "#eliminate_distinct_on-190" > < span class = "linenos" > 190< / span > < / a > < span class = "n" > order< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > )< / span >
2025-02-13 21:57:20 +01:00
< / span > < span id = "eliminate_distinct_on-191" > < a href = "#eliminate_distinct_on-191" > < span class = "linenos" > 191< / span > < / a > < span class = "k" > if< / span > < span class = "n" > order< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_distinct_on-192" > < a href = "#eliminate_distinct_on-192" > < span class = "linenos" > 192< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "n" > order< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ())< / span >
< / span > < span id = "eliminate_distinct_on-193" > < a href = "#eliminate_distinct_on-193" > < span class = "linenos" > 193< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_distinct_on-194" > < a href = "#eliminate_distinct_on-194" > < span class = "linenos" > 194< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span > < span class = "k" > for< / span > < span class = "n" > c< / span > < span class = "ow" > in< / span > < span class = "n" > distinct_cols< / span > < span class = "p" > ]))< / span >
< / span > < span id = "eliminate_distinct_on-195" > < a href = "#eliminate_distinct_on-195" > < span class = "linenos" > 195< / span > < / a >
< / span > < span id = "eliminate_distinct_on-196" > < a href = "#eliminate_distinct_on-196" > < span class = "linenos" > 196< / span > < / a > < span class = "n" > window< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > ,< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-197" > < a href = "#eliminate_distinct_on-197" > < span class = "linenos" > 197< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-198" > < a href = "#eliminate_distinct_on-198" > < span class = "linenos" > 198< / span > < / a >
< / span > < span id = "eliminate_distinct_on-199" > < a href = "#eliminate_distinct_on-199" > < span class = "linenos" > 199< / span > < / a > < span class = "c1" > # We add aliases to the projections so that we can safely reference them in the outer query< / span >
< / span > < span id = "eliminate_distinct_on-200" > < a href = "#eliminate_distinct_on-200" > < span class = "linenos" > 200< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "eliminate_distinct_on-201" > < a href = "#eliminate_distinct_on-201" > < span class = "linenos" > 201< / span > < / a > < span class = "n" > taken_names< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > }< / span >
< / span > < span id = "eliminate_distinct_on-202" > < a href = "#eliminate_distinct_on-202" > < span class = "linenos" > 202< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]:< / span >
< / span > < span id = "eliminate_distinct_on-203" > < a href = "#eliminate_distinct_on-203" > < span class = "linenos" > 203< / span > < / a > < span class = "k" > if< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > is_star< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_distinct_on-204" > < a href = "#eliminate_distinct_on-204" > < span class = "linenos" > 204< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Star< / span > < span class = "p" > ()]< / span >
< / span > < span id = "eliminate_distinct_on-205" > < a href = "#eliminate_distinct_on-205" > < span class = "linenos" > 205< / span > < / a > < span class = "k" > break< / span >
< / span > < span id = "eliminate_distinct_on-206" > < a href = "#eliminate_distinct_on-206" > < span class = "linenos" > 206< / span > < / a >
< / span > < span id = "eliminate_distinct_on-207" > < a href = "#eliminate_distinct_on-207" > < span class = "linenos" > 207< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_distinct_on-208" > < a href = "#eliminate_distinct_on-208" > < span class = "linenos" > 208< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_names< / span > < span class = "p" > ,< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "ow" > or< / span > < span class = "s2" > " _col" < / span > < span class = "p" > )< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "eliminate_distinct_on-209" > < a href = "#eliminate_distinct_on-209" > < span class = "linenos" > 209< / span > < / a > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " quoted" < / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "kc" > None< / span >
< / span > < span id = "eliminate_distinct_on-210" > < a href = "#eliminate_distinct_on-210" > < span class = "linenos" > 210< / span > < / a > < span class = "n" > select< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ,< / span > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > quoted< / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_distinct_on-211" > < a href = "#eliminate_distinct_on-211" > < span class = "linenos" > 211< / span > < / a >
< / span > < span id = "eliminate_distinct_on-212" > < a href = "#eliminate_distinct_on-212" > < span class = "linenos" > 212< / span > < / a > < span class = "n" > taken_names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-213" > < a href = "#eliminate_distinct_on-213" > < span class = "linenos" > 213< / span > < / a > < span class = "n" > new_selects< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ])< / span >
< / span > < span id = "eliminate_distinct_on-214" > < a href = "#eliminate_distinct_on-214" > < span class = "linenos" > 214< / span > < / a >
< / span > < span id = "eliminate_distinct_on-215" > < a href = "#eliminate_distinct_on-215" > < span class = "linenos" > 215< / span > < / a > < span class = "k" > return< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_distinct_on-216" > < a href = "#eliminate_distinct_on-216" > < span class = "linenos" > 216< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > new_selects< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-217" > < a href = "#eliminate_distinct_on-217" > < span class = "linenos" > 217< / span > < / a > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "s2" > " _t" < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-218" > < a href = "#eliminate_distinct_on-218" > < span class = "linenos" > 218< / span > < / a > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > row_number_window_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-219" > < a href = "#eliminate_distinct_on-219" > < span class = "linenos" > 219< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-220" > < a href = "#eliminate_distinct_on-220" > < span class = "linenos" > 220< / span > < / a >
< / span > < span id = "eliminate_distinct_on-221" > < a href = "#eliminate_distinct_on-221" > < span class = "linenos" > 221< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:23:26 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Convert SELECT DISTINCT ON statements to a subquery with a window function.< / p >
< p > This is useful for dialects that don't support SELECT DISTINCT ON but support window functions.< / p >
< h6 id = "arguments" > Arguments:< / h6 >
< ul >
< li > < strong > expression:< / strong > the expression that will be transformed.< / li >
< / ul >
< h6 id = "returns" > Returns:< / h6 >
< blockquote >
< p > The transformed expression.< / p >
< / blockquote >
< / div >
2025-02-13 15:46:19 +01:00
< / section >
< section id = "eliminate_qualify" >
< input id = "eliminate_qualify-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > eliminate_qualify< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "eliminate_qualify-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#eliminate_qualify" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_qualify-224" > < a href = "#eliminate_qualify-224" > < span class = "linenos" > 224< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_qualify< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "eliminate_qualify-225" > < a href = "#eliminate_qualify-225" > < span class = "linenos" > 225< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_qualify-226" > < a href = "#eliminate_qualify-226" > < span class = "linenos" > 226< / span > < / a > < span class = "sd" > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / span >
< / span > < span id = "eliminate_qualify-227" > < a href = "#eliminate_qualify-227" > < span class = "linenos" > 227< / span > < / a >
< / span > < span id = "eliminate_qualify-228" > < a href = "#eliminate_qualify-228" > < span class = "linenos" > 228< / span > < / a > < span class = "sd" > The idea behind this transformation can be seen in Snowflake' s documentation for QUALIFY:< / span >
< / span > < span id = "eliminate_qualify-229" > < a href = "#eliminate_qualify-229" > < span class = "linenos" > 229< / span > < / a > < span class = "sd" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / span >
< / span > < span id = "eliminate_qualify-230" > < a href = "#eliminate_qualify-230" > < span class = "linenos" > 230< / span > < / a >
< / span > < span id = "eliminate_qualify-231" > < a href = "#eliminate_qualify-231" > < span class = "linenos" > 231< / span > < / a > < span class = "sd" > Some dialects don' t support window functions in the WHERE clause, so we need to include them as< / span >
< / span > < span id = "eliminate_qualify-232" > < a href = "#eliminate_qualify-232" > < span class = "linenos" > 232< / span > < / a > < span class = "sd" > projections in the subquery, in order to refer to them in the outer filter using aliases. Also,< / span >
< / span > < span id = "eliminate_qualify-233" > < a href = "#eliminate_qualify-233" > < span class = "linenos" > 233< / span > < / a > < span class = "sd" > if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,< / span >
< / span > < span id = "eliminate_qualify-234" > < a href = "#eliminate_qualify-234" > < span class = "linenos" > 234< / span > < / a > < span class = "sd" > otherwise we won' t be able to refer to it in the outer query' s WHERE clause. Finally, if a< / span >
< / span > < span id = "eliminate_qualify-235" > < a href = "#eliminate_qualify-235" > < span class = "linenos" > 235< / span > < / a > < span class = "sd" > newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the< / span >
< / span > < span id = "eliminate_qualify-236" > < a href = "#eliminate_qualify-236" > < span class = "linenos" > 236< / span > < / a > < span class = "sd" > corresponding expression to avoid creating invalid column references.< / span >
< / span > < span id = "eliminate_qualify-237" > < a href = "#eliminate_qualify-237" > < span class = "linenos" > 237< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_qualify-238" > < a href = "#eliminate_qualify-238" > < span class = "linenos" > 238< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " qualify" < / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_qualify-239" > < a href = "#eliminate_qualify-239" > < span class = "linenos" > 239< / span > < / a > < span class = "n" > taken< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-240" > < a href = "#eliminate_qualify-240" > < span class = "linenos" > 240< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-241" > < a href = "#eliminate_qualify-241" > < span class = "linenos" > 241< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-242" > < a href = "#eliminate_qualify-242" > < span class = "linenos" > 242< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken< / span > < span class = "p" > ,< / span > < span class = "s2" > " _c" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-243" > < a href = "#eliminate_qualify-243" > < span class = "linenos" > 243< / span > < / a > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_qualify-244" > < a href = "#eliminate_qualify-244" > < span class = "linenos" > 244< / span > < / a > < span class = "n" > taken< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-245" > < a href = "#eliminate_qualify-245" > < span class = "linenos" > 245< / span > < / a >
2025-02-13 21:59:50 +01:00
< / span > < span id = "eliminate_qualify-246" > < a href = "#eliminate_qualify-246" > < span class = "linenos" > 246< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _select_alias_or_name< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "o" > |< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > :< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "eliminate_qualify-247" > < a href = "#eliminate_qualify-247" > < span class = "linenos" > 247< / span > < / a > < span class = "n" > alias_or_name< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span >
< / span > < span id = "eliminate_qualify-248" > < a href = "#eliminate_qualify-248" > < span class = "linenos" > 248< / span > < / a > < span class = "n" > identifier< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "eliminate_qualify-249" > < a href = "#eliminate_qualify-249" > < span class = "linenos" > 249< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > identifier< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Identifier< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_qualify-250" > < a href = "#eliminate_qualify-250" > < span class = "linenos" > 250< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > quoted< / span > < span class = "o" > =< / span > < span class = "n" > identifier< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " quoted" < / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_qualify-251" > < a href = "#eliminate_qualify-251" > < span class = "linenos" > 251< / span > < / a > < span class = "k" > return< / span > < span class = "n" > alias_or_name< / span >
< / span > < span id = "eliminate_qualify-252" > < a href = "#eliminate_qualify-252" > < span class = "linenos" > 252< / span > < / a >
< / span > < span id = "eliminate_qualify-253" > < a href = "#eliminate_qualify-253" > < span class = "linenos" > 253< / span > < / a > < span class = "n" > outer_selects< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "nb" > map< / span > < span class = "p" > (< / span > < span class = "n" > _select_alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > )))< / span >
< / span > < span id = "eliminate_qualify-254" > < a href = "#eliminate_qualify-254" > < span class = "linenos" > 254< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " qualify" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "eliminate_qualify-255" > < a href = "#eliminate_qualify-255" > < span class = "linenos" > 255< / span > < / a > < span class = "n" > expression_by_alias< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "eliminate_qualify-256" > < a href = "#eliminate_qualify-256" > < span class = "linenos" > 256< / span > < / a > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "p" > :< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "eliminate_qualify-257" > < a href = "#eliminate_qualify-257" > < span class = "linenos" > 257< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span >
< / span > < span id = "eliminate_qualify-258" > < a href = "#eliminate_qualify-258" > < span class = "linenos" > 258< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-259" > < a href = "#eliminate_qualify-259" > < span class = "linenos" > 259< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "eliminate_qualify-260" > < a href = "#eliminate_qualify-260" > < span class = "linenos" > 260< / span > < / a >
< / span > < span id = "eliminate_qualify-261" > < a href = "#eliminate_qualify-261" > < span class = "linenos" > 261< / span > < / a > < span class = "n" > select_candidates< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > is_star< / span > < span class = "k" > else< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span >
2025-03-04 07:54:36 +01:00
< / span > < span id = "eliminate_qualify-262" > < a href = "#eliminate_qualify-262" > < span class = "linenos" > 262< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select_candidate< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > qualify_filters< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > select_candidates< / span > < span class = "p" > )):< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "eliminate_qualify-263" > < a href = "#eliminate_qualify-263" > < span class = "linenos" > 263< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_qualify-264" > < a href = "#eliminate_qualify-264" > < span class = "linenos" > 264< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression_by_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-265" > < a href = "#eliminate_qualify-265" > < span class = "linenos" > 265< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_qualify-266" > < a href = "#eliminate_qualify-266" > < span class = "linenos" > 266< / span > < / a > < span class = "n" > expr< / span > < span class = "o" > =< / span > < span class = "n" > expression_by_alias< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-267" > < a href = "#eliminate_qualify-267" > < span class = "linenos" > 267< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expr< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-268" > < a href = "#eliminate_qualify-268" > < span class = "linenos" > 268< / span > < / a > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > expr< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-269" > < a href = "#eliminate_qualify-269" > < span class = "linenos" > 269< / span > < / a >
< / span > < span id = "eliminate_qualify-270" > < a href = "#eliminate_qualify-270" > < span class = "linenos" > 270< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > ,< / span > < span class = "s2" > " _w" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-271" > < a href = "#eliminate_qualify-271" > < span class = "linenos" > 271< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "p" > ,< / span > < span class = "n" > alias< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-272" > < a href = "#eliminate_qualify-272" > < span class = "linenos" > 272< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-273" > < a href = "#eliminate_qualify-273" > < span class = "linenos" > 273< / span > < / a >
< / span > < span id = "eliminate_qualify-274" > < a href = "#eliminate_qualify-274" > < span class = "linenos" > 274< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Qualify< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_qualify-275" > < a href = "#eliminate_qualify-275" > < span class = "linenos" > 275< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "o" > =< / span > < span class = "n" > column< / span >
< / span > < span id = "eliminate_qualify-276" > < a href = "#eliminate_qualify-276" > < span class = "linenos" > 276< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-277" > < a href = "#eliminate_qualify-277" > < span class = "linenos" > 277< / span > < / a > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-278" > < a href = "#eliminate_qualify-278" > < span class = "linenos" > 278< / span > < / a > < span class = "k" > elif< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_qualify-279" > < a href = "#eliminate_qualify-279" > < span class = "linenos" > 279< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > select_candidate< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-280" > < a href = "#eliminate_qualify-280" > < span class = "linenos" > 280< / span > < / a >
< / span > < span id = "eliminate_qualify-281" > < a href = "#eliminate_qualify-281" > < span class = "linenos" > 281< / span > < / a > < span class = "k" > return< / span > < span class = "n" > outer_selects< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > subquery< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "s2" > " _t" < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_qualify-282" > < a href = "#eliminate_qualify-282" > < span class = "linenos" > 282< / span > < / a > < span class = "n" > qualify_filters< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span >
< / span > < span id = "eliminate_qualify-283" > < a href = "#eliminate_qualify-283" > < span class = "linenos" > 283< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-284" > < a href = "#eliminate_qualify-284" > < span class = "linenos" > 284< / span > < / a >
< / span > < span id = "eliminate_qualify-285" > < a href = "#eliminate_qualify-285" > < span class = "linenos" > 285< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:46:19 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / p >
< p > The idea behind this transformation can be seen in Snowflake's documentation for QUALIFY:
< a href = "https://docs.snowflake.com/en/sql-reference/constructs/qualify" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / a > < / p >
< p > Some dialects don't support window functions in the WHERE clause, so we need to include them as
projections in the subquery, in order to refer to them in the outer filter using aliases. Also,
if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,
2025-02-13 21:32:41 +01:00
otherwise we won't be able to refer to it in the outer query's WHERE clause. Finally, if a
newly aliased projection is referenced in the QUALIFY clause, it will be replaced by the
corresponding expression to avoid creating invalid column references.< / p >
2025-02-13 15:46:19 +01:00
< / div >
2025-02-13 15:23:26 +01:00
< / section >
< section id = "remove_precision_parameterized_types" >
< input id = "remove_precision_parameterized_types-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > remove_precision_parameterized_types< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "remove_precision_parameterized_types-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#remove_precision_parameterized_types" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "remove_precision_parameterized_types-288" > < a href = "#remove_precision_parameterized_types-288" > < span class = "linenos" > 288< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_precision_parameterized_types< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "remove_precision_parameterized_types-289" > < a href = "#remove_precision_parameterized_types-289" > < span class = "linenos" > 289< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "remove_precision_parameterized_types-290" > < a href = "#remove_precision_parameterized_types-290" > < span class = "linenos" > 290< / span > < / a > < span class = "sd" > Some dialects only allow the precision for parameterized types to be defined in the DDL and not in< / span >
< / span > < span id = "remove_precision_parameterized_types-291" > < a href = "#remove_precision_parameterized_types-291" > < span class = "linenos" > 291< / span > < / a > < span class = "sd" > other expressions. This transforms removes the precision from parameterized types in expressions.< / span >
< / span > < span id = "remove_precision_parameterized_types-292" > < a href = "#remove_precision_parameterized_types-292" > < span class = "linenos" > 292< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "remove_precision_parameterized_types-293" > < a href = "#remove_precision_parameterized_types-293" > < span class = "linenos" > 293< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "p" > ):< / span >
< / span > < span id = "remove_precision_parameterized_types-294" > < a href = "#remove_precision_parameterized_types-294" > < span class = "linenos" > 294< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "remove_precision_parameterized_types-295" > < a href = "#remove_precision_parameterized_types-295" > < span class = "linenos" > 295< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > e< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataTypeParam< / span > < span class = "p" > )]< / span >
< / span > < span id = "remove_precision_parameterized_types-296" > < a href = "#remove_precision_parameterized_types-296" > < span class = "linenos" > 296< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "remove_precision_parameterized_types-297" > < a href = "#remove_precision_parameterized_types-297" > < span class = "linenos" > 297< / span > < / a >
< / span > < span id = "remove_precision_parameterized_types-298" > < a href = "#remove_precision_parameterized_types-298" > < span class = "linenos" > 298< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:23:26 +01:00
< / span > < / pre > < / div >
2025-02-13 15:50:57 +01:00
< div class = "docstring" > < p > Some dialects only allow the precision for parameterized types to be defined in the DDL and not in
other expressions. This transforms removes the precision from parameterized types in expressions.< / p >
2025-02-13 15:23:26 +01:00
< / div >
2025-02-13 21:32:41 +01:00
< / section >
< section id = "unqualify_unnest" >
< input id = "unqualify_unnest-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unqualify_unnest< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unqualify_unnest-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unqualify_unnest" > < / a >
2025-02-13 21:59:50 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unqualify_unnest-301" > < a href = "#unqualify_unnest-301" > < span class = "linenos" > 301< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unqualify_unnest< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "unqualify_unnest-302" > < a href = "#unqualify_unnest-302" > < span class = "linenos" > 302< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Remove references to unnest table aliases, added by the optimizer' s qualify_columns step." " " < / span >
2025-02-13 21:59:50 +01:00
< / span > < span id = "unqualify_unnest-303" > < a href = "#unqualify_unnest-303" > < span class = "linenos" > 303< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > find_all_in_scope< / span >
2025-02-13 21:57:37 +01:00
< / span > < span id = "unqualify_unnest-304" > < a href = "#unqualify_unnest-304" > < span class = "linenos" > 304< / span > < / a >
< / span > < span id = "unqualify_unnest-305" > < a href = "#unqualify_unnest-305" > < span class = "linenos" > 305< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "unqualify_unnest-306" > < a href = "#unqualify_unnest-306" > < span class = "linenos" > 306< / span > < / a > < span class = "n" > unnest_aliases< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "unqualify_unnest-307" > < a href = "#unqualify_unnest-307" > < span class = "linenos" > 307< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span >
< / span > < span id = "unqualify_unnest-308" > < a href = "#unqualify_unnest-308" > < span class = "linenos" > 308< / span > < / a > < span class = "k" > for< / span > < span class = "n" > unnest< / span > < span class = "ow" > in< / span > < span class = "n" > find_all_in_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > )< / span >
< / span > < span id = "unqualify_unnest-309" > < a href = "#unqualify_unnest-309" > < span class = "linenos" > 309< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > ))< / span >
< / span > < span id = "unqualify_unnest-310" > < a href = "#unqualify_unnest-310" > < span class = "linenos" > 310< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "unqualify_unnest-311" > < a href = "#unqualify_unnest-311" > < span class = "linenos" > 311< / span > < / a > < span class = "k" > if< / span > < span class = "n" > unnest_aliases< / span > < span class = "p" > :< / span >
< / span > < span id = "unqualify_unnest-312" > < a href = "#unqualify_unnest-312" > < span class = "linenos" > 312< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "unqualify_unnest-313" > < a href = "#unqualify_unnest-313" > < span class = "linenos" > 313< / span > < / a > < span class = "n" > leftmost_part< / span > < span class = "o" > =< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > parts< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "unqualify_unnest-314" > < a href = "#unqualify_unnest-314" > < span class = "linenos" > 314< / span > < / a > < span class = "k" > if< / span > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > arg_key< / span > < span class = "o" > !=< / span > < span class = "s2" > " this" < / span > < span class = "ow" > and< / span > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > in< / span > < span class = "n" > unnest_aliases< / span > < span class = "p" > :< / span >
< / span > < span id = "unqualify_unnest-315" > < a href = "#unqualify_unnest-315" > < span class = "linenos" > 315< / span > < / a > < span class = "n" > leftmost_part< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "unqualify_unnest-316" > < a href = "#unqualify_unnest-316" > < span class = "linenos" > 316< / span > < / a >
< / span > < span id = "unqualify_unnest-317" > < a href = "#unqualify_unnest-317" > < span class = "linenos" > 317< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:32:41 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Remove references to unnest table aliases, added by the optimizer's qualify_columns step.< / p >
< / div >
2025-02-13 15:52:09 +01:00
< / section >
< section id = "unnest_to_explode" >
< input id = "unnest_to_explode-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
2025-02-13 21:54:13 +01:00
< span class = "name" > unnest_to_explode< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > ,< / span > < span class = "param" > < span class = "n" > unnest_using_arrays_zip< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
2025-02-13 15:52:09 +01:00
< label class = "view-source-button" for = "unnest_to_explode-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unnest_to_explode" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unnest_to_explode-320" > < a href = "#unnest_to_explode-320" > < span class = "linenos" > 320< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unnest_to_explode< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-321" > < a href = "#unnest_to_explode-321" > < span class = "linenos" > 321< / span > < / a > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-322" > < a href = "#unnest_to_explode-322" > < span class = "linenos" > 322< / span > < / a > < span class = "n" > unnest_using_arrays_zip< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-323" > < a href = "#unnest_to_explode-323" > < span class = "linenos" > 323< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_to_explode-324" > < a href = "#unnest_to_explode-324" > < span class = "linenos" > 324< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert cross join unnest into lateral view explode." " " < / span >
< / span > < span id = "unnest_to_explode-325" > < a href = "#unnest_to_explode-325" > < span class = "linenos" > 325< / span > < / a >
< / span > < span id = "unnest_to_explode-326" > < a href = "#unnest_to_explode-326" > < span class = "linenos" > 326< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unnest_zip_exprs< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-327" > < a href = "#unnest_to_explode-327" > < span class = "linenos" > 327< / span > < / a > < span class = "n" > u< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ,< / span > < span class = "n" > unnest_exprs< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span >
< / span > < span id = "unnest_to_explode-328" > < a href = "#unnest_to_explode-328" > < span class = "linenos" > 328< / 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 = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]:< / span >
< / span > < span id = "unnest_to_explode-329" > < a href = "#unnest_to_explode-329" > < span class = "linenos" > 329< / span > < / a > < span class = "k" > if< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_to_explode-330" > < a href = "#unnest_to_explode-330" > < span class = "linenos" > 330< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > unnest_using_arrays_zip< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_to_explode-331" > < a href = "#unnest_to_explode-331" > < span class = "linenos" > 331< / span > < / a > < span class = "k" > raise< / span > < span class = "n" > UnsupportedError< / span > < span class = "p" > (< / span > < span class = "s2" > " Cannot transpile UNNEST with multiple input arrays" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-332" > < a href = "#unnest_to_explode-332" > < span class = "linenos" > 332< / span > < / a >
< / span > < span id = "unnest_to_explode-333" > < a href = "#unnest_to_explode-333" > < span class = "linenos" > 333< / span > < / a > < span class = "c1" > # Use INLINE(ARRAYS_ZIP(...)) for multiple expressions< / span >
< / span > < span id = "unnest_to_explode-334" > < a href = "#unnest_to_explode-334" > < span class = "linenos" > 334< / span > < / a > < span class = "n" > zip_exprs< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< / span > < span id = "unnest_to_explode-335" > < a href = "#unnest_to_explode-335" > < span class = "linenos" > 335< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Anonymous< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "s2" > " ARRAYS_ZIP" < / span > < span class = "p" > ,< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > unnest_exprs< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-336" > < a href = "#unnest_to_explode-336" > < span class = "linenos" > 336< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "unnest_to_explode-337" > < a href = "#unnest_to_explode-337" > < span class = "linenos" > 337< / span > < / a > < span class = "n" > u< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > zip_exprs< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-338" > < a href = "#unnest_to_explode-338" > < span class = "linenos" > 338< / span > < / a > < span class = "k" > return< / span > < span class = "n" > zip_exprs< / span >
< / span > < span id = "unnest_to_explode-339" > < a href = "#unnest_to_explode-339" > < span class = "linenos" > 339< / span > < / a > < span class = "k" > return< / span > < span class = "n" > unnest_exprs< / span >
< / span > < span id = "unnest_to_explode-340" > < a href = "#unnest_to_explode-340" > < span class = "linenos" > 340< / span > < / a >
< / span > < span id = "unnest_to_explode-341" > < a href = "#unnest_to_explode-341" > < span class = "linenos" > 341< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > u< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > :< / span > < span class = "nb" > bool< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Type< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Func< / span > < span class = "p" > ]:< / span >
< / span > < span id = "unnest_to_explode-342" > < a href = "#unnest_to_explode-342" > < span class = "linenos" > 342< / span > < / a > < span class = "k" > if< / span > < span class = "n" > u< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " offset" < / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-343" > < a href = "#unnest_to_explode-343" > < span class = "linenos" > 343< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Posexplode< / span >
< / span > < span id = "unnest_to_explode-344" > < a href = "#unnest_to_explode-344" > < span class = "linenos" > 344< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Inline< / span > < span class = "k" > if< / span > < span class = "n" > has_multi_expr< / span > < span class = "k" > else< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span >
< / span > < span id = "unnest_to_explode-345" > < a href = "#unnest_to_explode-345" > < span class = "linenos" > 345< / span > < / a >
< / span > < span id = "unnest_to_explode-346" > < a href = "#unnest_to_explode-346" > < span class = "linenos" > 346< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-347" > < a href = "#unnest_to_explode-347" > < span class = "linenos" > 347< / span > < / a > < span class = "n" > from_< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-348" > < a href = "#unnest_to_explode-348" > < span class = "linenos" > 348< / span > < / a >
< / span > < span id = "unnest_to_explode-349" > < a href = "#unnest_to_explode-349" > < span class = "linenos" > 349< / span > < / a > < span class = "k" > if< / span > < span class = "n" > from_< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > from_< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-350" > < a href = "#unnest_to_explode-350" > < span class = "linenos" > 350< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > from_< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "unnest_to_explode-351" > < a href = "#unnest_to_explode-351" > < span class = "linenos" > 351< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-352" > < a href = "#unnest_to_explode-352" > < span class = "linenos" > 352< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "unnest_to_explode-353" > < a href = "#unnest_to_explode-353" > < span class = "linenos" > 353< / span > < / a > < span class = "n" > has_multi_expr< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "unnest_to_explode-354" > < a href = "#unnest_to_explode-354" > < span class = "linenos" > 354< / span > < / a > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > _unnest_zip_exprs< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-355" > < a href = "#unnest_to_explode-355" > < span class = "linenos" > 355< / span > < / a >
< / span > < span id = "unnest_to_explode-356" > < a href = "#unnest_to_explode-356" > < span class = "linenos" > 356< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-357" > < a href = "#unnest_to_explode-357" > < span class = "linenos" > 357< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Table< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-358" > < a href = "#unnest_to_explode-358" > < span class = "linenos" > 358< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )(< / span >
< / span > < span id = "unnest_to_explode-359" > < a href = "#unnest_to_explode-359" > < span class = "linenos" > 359< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-360" > < a href = "#unnest_to_explode-360" > < span class = "linenos" > 360< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > expressions< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-361" > < a href = "#unnest_to_explode-361" > < span class = "linenos" > 361< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "unnest_to_explode-362" > < a href = "#unnest_to_explode-362" > < span class = "linenos" > 362< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "n" > alias< / span > < span class = "k" > else< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-363" > < a href = "#unnest_to_explode-363" > < span class = "linenos" > 363< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-364" > < a href = "#unnest_to_explode-364" > < span class = "linenos" > 364< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-365" > < a href = "#unnest_to_explode-365" > < span class = "linenos" > 365< / span > < / a >
< / span > < span id = "unnest_to_explode-366" > < a href = "#unnest_to_explode-366" > < span class = "linenos" > 366< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > []< / span >
< / span > < span id = "unnest_to_explode-367" > < a href = "#unnest_to_explode-367" > < span class = "linenos" > 367< / span > < / a > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > joins< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-368" > < a href = "#unnest_to_explode-368" > < span class = "linenos" > 368< / span > < / a > < span class = "n" > join_expr< / span > < span class = "o" > =< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "unnest_to_explode-369" > < a href = "#unnest_to_explode-369" > < span class = "linenos" > 369< / span > < / a >
< / span > < span id = "unnest_to_explode-370" > < a href = "#unnest_to_explode-370" > < span class = "linenos" > 370< / span > < / a > < span class = "n" > is_lateral< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > join_expr< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lateral< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-371" > < a href = "#unnest_to_explode-371" > < span class = "linenos" > 371< / span > < / a >
< / span > < span id = "unnest_to_explode-372" > < a href = "#unnest_to_explode-372" > < span class = "linenos" > 372< / span > < / a > < span class = "n" > unnest< / span > < span class = "o" > =< / span > < span class = "n" > join_expr< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "k" > if< / span > < span class = "n" > is_lateral< / span > < span class = "k" > else< / span > < span class = "n" > join_expr< / span >
< / span > < span id = "unnest_to_explode-373" > < a href = "#unnest_to_explode-373" > < span class = "linenos" > 373< / span > < / a >
< / span > < span id = "unnest_to_explode-374" > < a href = "#unnest_to_explode-374" > < span class = "linenos" > 374< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-375" > < a href = "#unnest_to_explode-375" > < span class = "linenos" > 375< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_lateral< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_to_explode-376" > < a href = "#unnest_to_explode-376" > < span class = "linenos" > 376< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > join_expr< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-377" > < a href = "#unnest_to_explode-377" > < span class = "linenos" > 377< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "unnest_to_explode-378" > < a href = "#unnest_to_explode-378" > < span class = "linenos" > 378< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-379" > < a href = "#unnest_to_explode-379" > < span class = "linenos" > 379< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > unnest< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "unnest_to_explode-380" > < a href = "#unnest_to_explode-380" > < span class = "linenos" > 380< / span > < / a > < span class = "c1" > # The number of unnest.expressions will be changed by _unnest_zip_exprs, we need to record it here< / span >
< / span > < span id = "unnest_to_explode-381" > < a href = "#unnest_to_explode-381" > < span class = "linenos" > 381< / span > < / a > < span class = "n" > has_multi_expr< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "unnest_to_explode-382" > < a href = "#unnest_to_explode-382" > < span class = "linenos" > 382< / span > < / a > < span class = "n" > exprs< / span > < span class = "o" > =< / span > < span class = "n" > _unnest_zip_exprs< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-383" > < a href = "#unnest_to_explode-383" > < span class = "linenos" > 383< / span > < / a >
< / span > < span id = "unnest_to_explode-384" > < a href = "#unnest_to_explode-384" > < span class = "linenos" > 384< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > .< / span > < span class = "n" > remove< / span > < span class = "p" > (< / span > < span class = "n" > join< / span > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-385" > < a href = "#unnest_to_explode-385" > < span class = "linenos" > 385< / span > < / a >
< / span > < span id = "unnest_to_explode-386" > < a href = "#unnest_to_explode-386" > < span class = "linenos" > 386< / span > < / a > < span class = "n" > alias_cols< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "k" > if< / span > < span class = "n" > alias< / span > < span class = "k" > else< / span > < span class = "p" > []< / span >
< / span > < span id = "unnest_to_explode-387" > < a href = "#unnest_to_explode-387" > < span class = "linenos" > 387< / span > < / a >
< / span > < span id = "unnest_to_explode-388" > < a href = "#unnest_to_explode-388" > < span class = "linenos" > 388< / span > < / a > < span class = "c1" > # # Handle UNNEST to LATERAL VIEW EXPLODE: Exception is raised when there are 0 or > 2 aliases< / span >
< / span > < span id = "unnest_to_explode-389" > < a href = "#unnest_to_explode-389" > < span class = "linenos" > 389< / span > < / a > < span class = "c1" > # Spark LATERAL VIEW EXPLODE requires single alias for array/struct and two for Map type column unlike unnest in trino/presto which can take an arbitrary amount.< / span >
< / span > < span id = "unnest_to_explode-390" > < a href = "#unnest_to_explode-390" > < span class = "linenos" > 390< / span > < / a > < span class = "c1" > # Refs: https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-lateral-view.html< / span >
< / span > < span id = "unnest_to_explode-391" > < a href = "#unnest_to_explode-391" > < span class = "linenos" > 391< / span > < / a >
< / span > < span id = "unnest_to_explode-392" > < a href = "#unnest_to_explode-392" > < span class = "linenos" > 392< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > has_multi_expr< / span > < span class = "ow" > and< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > alias_cols< / span > < span class = "p" > )< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "mi" > 2< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-393" > < a href = "#unnest_to_explode-393" > < span class = "linenos" > 393< / span > < / a > < span class = "k" > raise< / span > < span class = "n" > UnsupportedError< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-394" > < a href = "#unnest_to_explode-394" > < span class = "linenos" > 394< / span > < / a > < span class = "s2" > " CROSS JOIN UNNEST to LATERAL VIEW EXPLODE transformation requires explicit column aliases" < / span >
< / span > < span id = "unnest_to_explode-395" > < a href = "#unnest_to_explode-395" > < span class = "linenos" > 395< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-396" > < a href = "#unnest_to_explode-396" > < span class = "linenos" > 396< / span > < / a >
< / span > < span id = "unnest_to_explode-397" > < a href = "#unnest_to_explode-397" > < span class = "linenos" > 397< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > exprs< / span > < span class = "p" > ,< / span > < span class = "n" > alias_cols< / span > < span class = "p" > ):< / span >
< / span > < span id = "unnest_to_explode-398" > < a href = "#unnest_to_explode-398" > < span class = "linenos" > 398< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-399" > < a href = "#unnest_to_explode-399" > < span class = "linenos" > 399< / span > < / a > < span class = "s2" > " laterals" < / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-400" > < a href = "#unnest_to_explode-400" > < span class = "linenos" > 400< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lateral< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-401" > < a href = "#unnest_to_explode-401" > < span class = "linenos" > 401< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > _udtf_type< / span > < span class = "p" > (< / span > < span class = "n" > unnest< / span > < span class = "p" > ,< / span > < span class = "n" > has_multi_expr< / span > < span class = "p" > )(< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > e< / span > < span class = "p" > ),< / span >
< / span > < span id = "unnest_to_explode-402" > < a href = "#unnest_to_explode-402" > < span class = "linenos" > 402< / span > < / a > < span class = "n" > view< / span > < span class = "o" > =< / span > < span class = "kc" > True< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-403" > < a href = "#unnest_to_explode-403" > < span class = "linenos" > 403< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TableAlias< / span > < span class = "p" > (< / span >
< / span > < span id = "unnest_to_explode-404" > < a href = "#unnest_to_explode-404" > < span class = "linenos" > 404< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "c1" > # type: ignore< / span >
< / span > < span id = "unnest_to_explode-405" > < a href = "#unnest_to_explode-405" > < span class = "linenos" > 405< / span > < / a > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "n" > alias_cols< / span > < span class = "p" > ,< / span >
< / span > < span id = "unnest_to_explode-406" > < a href = "#unnest_to_explode-406" > < span class = "linenos" > 406< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "unnest_to_explode-407" > < a href = "#unnest_to_explode-407" > < span class = "linenos" > 407< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "unnest_to_explode-408" > < a href = "#unnest_to_explode-408" > < span class = "linenos" > 408< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "unnest_to_explode-409" > < a href = "#unnest_to_explode-409" > < span class = "linenos" > 409< / span > < / a >
< / span > < span id = "unnest_to_explode-410" > < a href = "#unnest_to_explode-410" > < span class = "linenos" > 410< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:52:09 +01:00
< / span > < / pre > < / div >
2025-02-13 21:17:09 +01:00
< div class = "docstring" > < p > Convert cross join unnest into lateral view explode.< / p >
2025-02-13 15:52:09 +01:00
< / div >
< / section >
2025-04-06 10:17:01 +02:00
< section id = "explode_projection_to_unnest" >
< input id = "explode_projection_to_unnest-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
2025-02-13 15:52:09 +01:00
< div class = "attr function" >
< span class = "def" > def< / span >
2025-04-06 10:17:01 +02:00
< span class = "name" > explode_projection_to_unnest< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > index_offset< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ],< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ]< / span > :< / span > < / span >
2025-02-13 15:52:09 +01:00
2025-04-06 10:17:01 +02:00
< label class = "view-source-button" for = "explode_projection_to_unnest-view-source" > < span > View Source< / span > < / label >
2025-02-13 15:52:09 +01:00
< / div >
2025-04-06 10:17:01 +02:00
< a class = "headerlink" href = "#explode_projection_to_unnest" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "explode_projection_to_unnest-413" > < a href = "#explode_projection_to_unnest-413" > < span class = "linenos" > 413< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > explode_projection_to_unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-414" > < a href = "#explode_projection_to_unnest-414" > < span class = "linenos" > 414< / span > < / a > < span class = "n" > index_offset< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-415" > < a href = "#explode_projection_to_unnest-415" > < span class = "linenos" > 415< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]:< / span >
< / span > < span id = "explode_projection_to_unnest-416" > < a href = "#explode_projection_to_unnest-416" > < span class = "linenos" > 416< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert explode/posexplode projections into unnests." " " < / span >
< / span > < span id = "explode_projection_to_unnest-417" > < a href = "#explode_projection_to_unnest-417" > < span class = "linenos" > 417< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-418" > < a href = "#explode_projection_to_unnest-418" > < span class = "linenos" > 418< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _explode_projection_to_unnest< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-419" > < a href = "#explode_projection_to_unnest-419" > < span class = "linenos" > 419< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-420" > < a href = "#explode_projection_to_unnest-420" > < span class = "linenos" > 420< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > Scope< / span >
< / span > < span id = "explode_projection_to_unnest-421" > < a href = "#explode_projection_to_unnest-421" > < span class = "linenos" > 421< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-422" > < a href = "#explode_projection_to_unnest-422" > < span class = "linenos" > 422< / span > < / a > < span class = "n" > taken_select_names< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > named_selects< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-423" > < a href = "#explode_projection_to_unnest-423" > < span class = "linenos" > 423< / span > < / a > < span class = "n" > taken_source_names< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > name< / span > < span class = "k" > for< / span > < span class = "n" > name< / span > < span class = "p" > ,< / span > < span class = "n" > _< / span > < span class = "ow" > in< / span > < span class = "n" > Scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > references< / span > < span class = "p" > }< / span >
< / span > < span id = "explode_projection_to_unnest-424" > < a href = "#explode_projection_to_unnest-424" > < span class = "linenos" > 424< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-425" > < a href = "#explode_projection_to_unnest-425" > < span class = "linenos" > 425< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > names< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Set< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ],< / span > < span class = "n" > name< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-426" > < a href = "#explode_projection_to_unnest-426" > < span class = "linenos" > 426< / span > < / a > < span class = "n" > name< / span > < span class = "o" > =< / span > < span class = "n" > find_new_name< / span > < span class = "p" > (< / span > < span class = "n" > names< / span > < span class = "p" > ,< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-427" > < a href = "#explode_projection_to_unnest-427" > < span class = "linenos" > 427< / span > < / a > < span class = "n" > names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > name< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-428" > < a href = "#explode_projection_to_unnest-428" > < span class = "linenos" > 428< / span > < / a > < span class = "k" > return< / span > < span class = "n" > name< / span >
< / span > < span id = "explode_projection_to_unnest-429" > < a href = "#explode_projection_to_unnest-429" > < span class = "linenos" > 429< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-430" > < a href = "#explode_projection_to_unnest-430" > < span class = "linenos" > 430< / span > < / a > < span class = "n" > arrays< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > []< / span >
< / span > < span id = "explode_projection_to_unnest-431" > < a href = "#explode_projection_to_unnest-431" > < span class = "linenos" > 431< / span > < / a > < span class = "n" > series_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-432" > < a href = "#explode_projection_to_unnest-432" > < span class = "linenos" > 432< / span > < / a > < span class = "n" > series< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-433" > < a href = "#explode_projection_to_unnest-433" > < span class = "linenos" > 433< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-434" > < a href = "#explode_projection_to_unnest-434" > < span class = "linenos" > 434< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > GenerateSeries< / span > < span class = "p" > (< / span > < span class = "n" > start< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > number< / span > < span class = "p" > (< / span > < span class = "n" > index_offset< / span > < span class = "p" > ))]< / span >
< / span > < span id = "explode_projection_to_unnest-435" > < a href = "#explode_projection_to_unnest-435" > < span class = "linenos" > 435< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-436" > < a href = "#explode_projection_to_unnest-436" > < span class = "linenos" > 436< / span > < / a > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_source_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " _u" < / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-437" > < a href = "#explode_projection_to_unnest-437" > < span class = "linenos" > 437< / span > < / a > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > series_alias< / span > < span class = "p" > ],< / span >
< / span > < span id = "explode_projection_to_unnest-438" > < a href = "#explode_projection_to_unnest-438" > < span class = "linenos" > 438< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-439" > < a href = "#explode_projection_to_unnest-439" > < span class = "linenos" > 439< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-440" > < a href = "#explode_projection_to_unnest-440" > < span class = "linenos" > 440< / span > < / a > < span class = "c1" > # we use list here because expression.selects is mutated inside the loop< / span >
< / span > < span id = "explode_projection_to_unnest-441" > < a href = "#explode_projection_to_unnest-441" > < span class = "linenos" > 441< / span > < / a > < span class = "k" > for< / span > < span class = "n" > select< / span > < span class = "ow" > in< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-442" > < a href = "#explode_projection_to_unnest-442" > < span class = "linenos" > 442< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-443" > < a href = "#explode_projection_to_unnest-443" > < span class = "linenos" > 443< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-444" > < a href = "#explode_projection_to_unnest-444" > < span class = "linenos" > 444< / span > < / a > < span class = "k" > if< / span > < span class = "n" > explode< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-445" > < a href = "#explode_projection_to_unnest-445" > < span class = "linenos" > 445< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "s2" > " " < / span >
< / span > < span id = "explode_projection_to_unnest-446" > < a href = "#explode_projection_to_unnest-446" > < span class = "linenos" > 446< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "s2" > " " < / span >
< / span > < span id = "explode_projection_to_unnest-447" > < a href = "#explode_projection_to_unnest-447" > < span class = "linenos" > 447< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-448" > < a href = "#explode_projection_to_unnest-448" > < span class = "linenos" > 448< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Alias< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-449" > < a href = "#explode_projection_to_unnest-449" > < span class = "linenos" > 449< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span >
< / span > < span id = "explode_projection_to_unnest-450" > < a href = "#explode_projection_to_unnest-450" > < span class = "linenos" > 450< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span >
< / span > < span id = "explode_projection_to_unnest-451" > < a href = "#explode_projection_to_unnest-451" > < span class = "linenos" > 451< / span > < / a > < span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Aliases< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-452" > < a href = "#explode_projection_to_unnest-452" > < span class = "linenos" > 452< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > aliases< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "explode_projection_to_unnest-453" > < a href = "#explode_projection_to_unnest-453" > < span class = "linenos" > 453< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > aliases< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span >
< / span > < span id = "explode_projection_to_unnest-454" > < a href = "#explode_projection_to_unnest-454" > < span class = "linenos" > 454< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "s2" > " " < / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ))< / span >
< / span > < span id = "explode_projection_to_unnest-455" > < a href = "#explode_projection_to_unnest-455" > < span class = "linenos" > 455< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-456" > < a href = "#explode_projection_to_unnest-456" > < span class = "linenos" > 456< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > =< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > select< / span > < span class = "p" > ,< / span > < span class = "s2" > " " < / span > < span class = "p" > ))< / span >
< / span > < span id = "explode_projection_to_unnest-457" > < a href = "#explode_projection_to_unnest-457" > < span class = "linenos" > 457< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > =< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Explode< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-458" > < a href = "#explode_projection_to_unnest-458" > < span class = "linenos" > 458< / span > < / a > < span class = "k" > assert< / span > < span class = "n" > explode< / span >
< / span > < span id = "explode_projection_to_unnest-459" > < a href = "#explode_projection_to_unnest-459" > < span class = "linenos" > 459< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-460" > < a href = "#explode_projection_to_unnest-460" > < span class = "linenos" > 460< / span > < / a > < span class = "n" > is_posexplode< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Posexplode< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-461" > < a href = "#explode_projection_to_unnest-461" > < span class = "linenos" > 461< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "o" > =< / span > < span class = "n" > explode< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "explode_projection_to_unnest-462" > < a href = "#explode_projection_to_unnest-462" > < span class = "linenos" > 462< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-463" > < a href = "#explode_projection_to_unnest-463" > < span class = "linenos" > 463< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ExplodeOuter< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-464" > < a href = "#explode_projection_to_unnest-464" > < span class = "linenos" > 464< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > =< / span > < span class = "n" > explode_arg< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "explode_projection_to_unnest-465" > < a href = "#explode_projection_to_unnest-465" > < span class = "linenos" > 465< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " safe" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-466" > < a href = "#explode_projection_to_unnest-466" > < span class = "linenos" > 466< / span > < / a > < span class = "n" > bracket< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " offset" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-467" > < a href = "#explode_projection_to_unnest-467" > < span class = "linenos" > 467< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-468" > < a href = "#explode_projection_to_unnest-468" > < span class = "linenos" > 468< / span > < / a > < span class = "s2" > " IF" < / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-469" > < a href = "#explode_projection_to_unnest-469" > < span class = "linenos" > 469< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-470" > < a href = "#explode_projection_to_unnest-470" > < span class = "linenos" > 470< / span > < / a > < span class = "s2" > " ARRAY_SIZE" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > func< / span > < span class = "p" > (< / span > < span class = "s2" > " COALESCE" < / span > < span class = "p" > ,< / span > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Array< / span > < span class = "p" > ())< / span >
< / span > < span id = "explode_projection_to_unnest-471" > < a href = "#explode_projection_to_unnest-471" > < span class = "linenos" > 471< / span > < / a > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-472" > < a href = "#explode_projection_to_unnest-472" > < span class = "linenos" > 472< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > (< / span > < span class = "n" > bracket< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-473" > < a href = "#explode_projection_to_unnest-473" > < span class = "linenos" > 473< / span > < / a > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-474" > < a href = "#explode_projection_to_unnest-474" > < span class = "linenos" > 474< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-475" > < a href = "#explode_projection_to_unnest-475" > < span class = "linenos" > 475< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-476" > < a href = "#explode_projection_to_unnest-476" > < span class = "linenos" > 476< / span > < / a > < span class = "c1" > # This ensures that we won' t use [POS]EXPLODE' s argument as a new selection< / span >
< / span > < span id = "explode_projection_to_unnest-477" > < a href = "#explode_projection_to_unnest-477" > < span class = "linenos" > 477< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > explode_arg< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-478" > < a href = "#explode_projection_to_unnest-478" > < span class = "linenos" > 478< / span > < / a > < span class = "n" > taken_select_names< / span > < span class = "o" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > output_name< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-479" > < a href = "#explode_projection_to_unnest-479" > < span class = "linenos" > 479< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-480" > < a href = "#explode_projection_to_unnest-480" > < span class = "linenos" > 480< / span > < / a > < span class = "n" > unnest_source_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_source_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " _u" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-481" > < a href = "#explode_projection_to_unnest-481" > < span class = "linenos" > 481< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-482" > < a href = "#explode_projection_to_unnest-482" > < span class = "linenos" > 482< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > explode_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-483" > < a href = "#explode_projection_to_unnest-483" > < span class = "linenos" > 483< / span > < / a > < span class = "n" > explode_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " col" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-484" > < a href = "#explode_projection_to_unnest-484" > < span class = "linenos" > 484< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-485" > < a href = "#explode_projection_to_unnest-485" > < span class = "linenos" > 485< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_posexplode< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-486" > < a href = "#explode_projection_to_unnest-486" > < span class = "linenos" > 486< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-487" > < a href = "#explode_projection_to_unnest-487" > < span class = "linenos" > 487< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-488" > < a href = "#explode_projection_to_unnest-488" > < span class = "linenos" > 488< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > pos_alias< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-489" > < a href = "#explode_projection_to_unnest-489" > < span class = "linenos" > 489< / span > < / a > < span class = "n" > pos_alias< / span > < span class = "o" > =< / span > < span class = "n" > new_name< / span > < span class = "p" > (< / span > < span class = "n" > taken_select_names< / span > < span class = "p" > ,< / span > < span class = "s2" > " pos" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-490" > < a href = "#explode_projection_to_unnest-490" > < span class = "linenos" > 490< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-491" > < a href = "#explode_projection_to_unnest-491" > < span class = "linenos" > 491< / span > < / a > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "explode_projection_to_unnest-492" > < a href = "#explode_projection_to_unnest-492" > < span class = "linenos" > 492< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-493" > < a href = "#explode_projection_to_unnest-493" > < span class = "linenos" > 493< / span > < / a > < span class = "n" > series_table_alias< / span > < span class = "o" > =< / span > < span class = "n" > series< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "explode_projection_to_unnest-494" > < a href = "#explode_projection_to_unnest-494" > < span class = "linenos" > 494< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > If< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-495" > < a href = "#explode_projection_to_unnest-495" > < span class = "linenos" > 495< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-496" > < a href = "#explode_projection_to_unnest-496" > < span class = "linenos" > 496< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-497" > < a href = "#explode_projection_to_unnest-497" > < span class = "linenos" > 497< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-498" > < a href = "#explode_projection_to_unnest-498" > < span class = "linenos" > 498< / span > < / a > < span class = "n" > true< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-499" > < a href = "#explode_projection_to_unnest-499" > < span class = "linenos" > 499< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-500" > < a href = "#explode_projection_to_unnest-500" > < span class = "linenos" > 500< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-501" > < a href = "#explode_projection_to_unnest-501" > < span class = "linenos" > 501< / span > < / a > < span class = "n" > explode< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > column< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-502" > < a href = "#explode_projection_to_unnest-502" > < span class = "linenos" > 502< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-503" > < a href = "#explode_projection_to_unnest-503" > < span class = "linenos" > 503< / span > < / a > < span class = "k" > if< / span > < span class = "n" > is_posexplode< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-504" > < a href = "#explode_projection_to_unnest-504" > < span class = "linenos" > 504< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "explode_projection_to_unnest-505" > < a href = "#explode_projection_to_unnest-505" > < span class = "linenos" > 505< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > insert< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-506" > < a href = "#explode_projection_to_unnest-506" > < span class = "linenos" > 506< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > index< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > )< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-507" > < a href = "#explode_projection_to_unnest-507" > < span class = "linenos" > 507< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > If< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-508" > < a href = "#explode_projection_to_unnest-508" > < span class = "linenos" > 508< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-509" > < a href = "#explode_projection_to_unnest-509" > < span class = "linenos" > 509< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-510" > < a href = "#explode_projection_to_unnest-510" > < span class = "linenos" > 510< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-511" > < a href = "#explode_projection_to_unnest-511" > < span class = "linenos" > 511< / span > < / a > < span class = "n" > true< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-512" > < a href = "#explode_projection_to_unnest-512" > < span class = "linenos" > 512< / span > < / a > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > as_< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-513" > < a href = "#explode_projection_to_unnest-513" > < span class = "linenos" > 513< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-514" > < a href = "#explode_projection_to_unnest-514" > < span class = "linenos" > 514< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-515" > < a href = "#explode_projection_to_unnest-515" > < span class = "linenos" > 515< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-516" > < a href = "#explode_projection_to_unnest-516" > < span class = "linenos" > 516< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > arrays< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-517" > < a href = "#explode_projection_to_unnest-517" > < span class = "linenos" > 517< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > ):< / span >
< / span > < span id = "explode_projection_to_unnest-518" > < a href = "#explode_projection_to_unnest-518" > < span class = "linenos" > 518< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > join< / span > < span class = "p" > (< / span > < span class = "n" > series< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span > < span class = "n" > join_type< / span > < span class = "o" > =< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-519" > < a href = "#explode_projection_to_unnest-519" > < span class = "linenos" > 519< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-520" > < a href = "#explode_projection_to_unnest-520" > < span class = "linenos" > 520< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > series< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-521" > < a href = "#explode_projection_to_unnest-521" > < span class = "linenos" > 521< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-522" > < a href = "#explode_projection_to_unnest-522" > < span class = "linenos" > 522< / span > < / a > < span class = "n" > size< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ArraySize< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "explode_projection_to_unnest-523" > < a href = "#explode_projection_to_unnest-523" > < span class = "linenos" > 523< / span > < / a > < span class = "n" > arrays< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > size< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-524" > < a href = "#explode_projection_to_unnest-524" > < span class = "linenos" > 524< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-525" > < a href = "#explode_projection_to_unnest-525" > < span class = "linenos" > 525< / span > < / a > < span class = "c1" > # trino doesn' t support left join unnest with on conditions< / span >
< / span > < span id = "explode_projection_to_unnest-526" > < a href = "#explode_projection_to_unnest-526" > < span class = "linenos" > 526< / span > < / a > < span class = "c1" > # if it did, this would be much simpler< / span >
< / span > < span id = "explode_projection_to_unnest-527" > < a href = "#explode_projection_to_unnest-527" > < span class = "linenos" > 527< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > join< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-528" > < a href = "#explode_projection_to_unnest-528" > < span class = "linenos" > 528< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-529" > < a href = "#explode_projection_to_unnest-529" > < span class = "linenos" > 529< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Unnest< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-530" > < a href = "#explode_projection_to_unnest-530" > < span class = "linenos" > 530< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > explode_arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()],< / span >
< / span > < span id = "explode_projection_to_unnest-531" > < a href = "#explode_projection_to_unnest-531" > < span class = "linenos" > 531< / span > < / a > < span class = "n" > offset< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-532" > < a href = "#explode_projection_to_unnest-532" > < span class = "linenos" > 532< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-533" > < a href = "#explode_projection_to_unnest-533" > < span class = "linenos" > 533< / span > < / a > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-534" > < a href = "#explode_projection_to_unnest-534" > < span class = "linenos" > 534< / span > < / a > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > explode_alias< / span > < span class = "p" > ],< / span >
< / span > < span id = "explode_projection_to_unnest-535" > < a href = "#explode_projection_to_unnest-535" > < span class = "linenos" > 535< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-536" > < a href = "#explode_projection_to_unnest-536" > < span class = "linenos" > 536< / span > < / a > < span class = "n" > join_type< / span > < span class = "o" > =< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-537" > < a href = "#explode_projection_to_unnest-537" > < span class = "linenos" > 537< / span > < / a > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-538" > < a href = "#explode_projection_to_unnest-538" > < span class = "linenos" > 538< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-539" > < a href = "#explode_projection_to_unnest-539" > < span class = "linenos" > 539< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-540" > < a href = "#explode_projection_to_unnest-540" > < span class = "linenos" > 540< / span > < / a > < span class = "k" > if< / span > < span class = "n" > index_offset< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-541" > < a href = "#explode_projection_to_unnest-541" > < span class = "linenos" > 541< / span > < / a > < span class = "n" > size< / span > < span class = "o" > =< / span > < span class = "n" > size< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span >
< / span > < span id = "explode_projection_to_unnest-542" > < a href = "#explode_projection_to_unnest-542" > < span class = "linenos" > 542< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-543" > < a href = "#explode_projection_to_unnest-543" > < span class = "linenos" > 543< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-544" > < a href = "#explode_projection_to_unnest-544" > < span class = "linenos" > 544< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-545" > < a href = "#explode_projection_to_unnest-545" > < span class = "linenos" > 545< / span > < / a > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "explode_projection_to_unnest-546" > < a href = "#explode_projection_to_unnest-546" > < span class = "linenos" > 546< / span > < / a > < span class = "o" > .< / span > < span class = "n" > or_< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-547" > < a href = "#explode_projection_to_unnest-547" > < span class = "linenos" > 547< / span > < / a > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > series_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > series_table_alias< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "n" > size< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span >
< / span > < span id = "explode_projection_to_unnest-548" > < a href = "#explode_projection_to_unnest-548" > < span class = "linenos" > 548< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > pos_alias< / span > < span class = "p" > ,< / span > < span class = "n" > table< / span > < span class = "o" > =< / span > < span class = "n" > unnest_source_alias< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > size< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-549" > < a href = "#explode_projection_to_unnest-549" > < span class = "linenos" > 549< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-550" > < a href = "#explode_projection_to_unnest-550" > < span class = "linenos" > 550< / span > < / a > < span class = "p" > ),< / span >
< / span > < span id = "explode_projection_to_unnest-551" > < a href = "#explode_projection_to_unnest-551" > < span class = "linenos" > 551< / span > < / a > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span >
< / span > < span id = "explode_projection_to_unnest-552" > < a href = "#explode_projection_to_unnest-552" > < span class = "linenos" > 552< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-553" > < a href = "#explode_projection_to_unnest-553" > < span class = "linenos" > 553< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-554" > < a href = "#explode_projection_to_unnest-554" > < span class = "linenos" > 554< / span > < / a > < span class = "k" > if< / span > < span class = "n" > arrays< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-555" > < a href = "#explode_projection_to_unnest-555" > < span class = "linenos" > 555< / span > < / a > < span class = "n" > end< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Condition< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Greatest< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > arrays< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > arrays< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :])< / span >
< / span > < span id = "explode_projection_to_unnest-556" > < a href = "#explode_projection_to_unnest-556" > < span class = "linenos" > 556< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-557" > < a href = "#explode_projection_to_unnest-557" > < span class = "linenos" > 557< / span > < / a > < span class = "k" > if< / span > < span class = "n" > index_offset< / span > < span class = "o" > !=< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "explode_projection_to_unnest-558" > < a href = "#explode_projection_to_unnest-558" > < span class = "linenos" > 558< / span > < / a > < span class = "n" > end< / span > < span class = "o" > =< / span > < span class = "n" > end< / span > < span class = "o" > -< / span > < span class = "p" > (< / span > < span class = "mi" > 1< / span > < span class = "o" > -< / span > < span class = "n" > index_offset< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-559" > < a href = "#explode_projection_to_unnest-559" > < span class = "linenos" > 559< / span > < / a > < span class = "n" > series< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " end" < / span > < span class = "p" > ,< / span > < span class = "n" > end< / span > < span class = "p" > )< / span >
< / span > < span id = "explode_projection_to_unnest-560" > < a href = "#explode_projection_to_unnest-560" > < span class = "linenos" > 560< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-561" > < a href = "#explode_projection_to_unnest-561" > < span class = "linenos" > 561< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "explode_projection_to_unnest-562" > < a href = "#explode_projection_to_unnest-562" > < span class = "linenos" > 562< / span > < / a >
< / span > < span id = "explode_projection_to_unnest-563" > < a href = "#explode_projection_to_unnest-563" > < span class = "linenos" > 563< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _explode_projection_to_unnest< / span >
2025-02-13 15:52:09 +01:00
< / span > < / pre > < / div >
2025-04-06 10:17:01 +02:00
< div class = "docstring" > < p > Convert explode/posexplode projections into unnests.< / p >
2025-02-13 21:16:09 +01:00
< / div >
2025-02-13 15:52:09 +01:00
2025-02-13 21:03:38 +01:00
< / section >
< section id = "add_within_group_for_percentiles" >
< input id = "add_within_group_for_percentiles-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > add_within_group_for_percentiles< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "add_within_group_for_percentiles-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#add_within_group_for_percentiles" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "add_within_group_for_percentiles-566" > < a href = "#add_within_group_for_percentiles-566" > < span class = "linenos" > 566< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > add_within_group_for_percentiles< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "add_within_group_for_percentiles-567" > < a href = "#add_within_group_for_percentiles-567" > < span class = "linenos" > 567< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Transforms percentiles by adding a WITHIN GROUP clause to them." " " < / span >
< / span > < span id = "add_within_group_for_percentiles-568" > < a href = "#add_within_group_for_percentiles-568" > < span class = "linenos" > 568< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "add_within_group_for_percentiles-569" > < a href = "#add_within_group_for_percentiles-569" > < span class = "linenos" > 569< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PERCENTILES< / span > < span class = "p" > )< / span >
< / span > < span id = "add_within_group_for_percentiles-570" > < a href = "#add_within_group_for_percentiles-570" > < span class = "linenos" > 570< / span > < / a > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > )< / span >
< / span > < span id = "add_within_group_for_percentiles-571" > < a href = "#add_within_group_for_percentiles-571" > < span class = "linenos" > 571< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span >
< / span > < span id = "add_within_group_for_percentiles-572" > < a href = "#add_within_group_for_percentiles-572" > < span class = "linenos" > 572< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "add_within_group_for_percentiles-573" > < a href = "#add_within_group_for_percentiles-573" > < span class = "linenos" > 573< / span > < / a > < span class = "n" > column< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "add_within_group_for_percentiles-574" > < a href = "#add_within_group_for_percentiles-574" > < span class = "linenos" > 574< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ())< / span >
< / span > < span id = "add_within_group_for_percentiles-575" > < a href = "#add_within_group_for_percentiles-575" > < span class = "linenos" > 575< / span > < / a > < span class = "n" > order< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > column< / span > < span class = "p" > )])< / span >
< / span > < span id = "add_within_group_for_percentiles-576" > < a href = "#add_within_group_for_percentiles-576" > < span class = "linenos" > 576< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > order< / span > < span class = "p" > )< / span >
< / span > < span id = "add_within_group_for_percentiles-577" > < a href = "#add_within_group_for_percentiles-577" > < span class = "linenos" > 577< / span > < / a >
< / span > < span id = "add_within_group_for_percentiles-578" > < a href = "#add_within_group_for_percentiles-578" > < span class = "linenos" > 578< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:03:38 +01:00
< / span > < / pre > < / div >
2025-02-13 21:16:09 +01:00
< div class = "docstring" > < p > Transforms percentiles by adding a WITHIN GROUP clause to them.< / p >
< / div >
2025-02-13 15:52:09 +01:00
2025-02-13 15:57:23 +01:00
< / section >
< section id = "remove_within_group_for_percentiles" >
< input id = "remove_within_group_for_percentiles-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > remove_within_group_for_percentiles< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "remove_within_group_for_percentiles-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#remove_within_group_for_percentiles" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "remove_within_group_for_percentiles-581" > < a href = "#remove_within_group_for_percentiles-581" > < span class = "linenos" > 581< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_within_group_for_percentiles< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "remove_within_group_for_percentiles-582" > < a href = "#remove_within_group_for_percentiles-582" > < span class = "linenos" > 582< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause." " " < / span >
< / span > < span id = "remove_within_group_for_percentiles-583" > < a href = "#remove_within_group_for_percentiles-583" > < span class = "linenos" > 583< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "remove_within_group_for_percentiles-584" > < a href = "#remove_within_group_for_percentiles-584" > < span class = "linenos" > 584< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > WithinGroup< / span > < span class = "p" > )< / span >
< / span > < span id = "remove_within_group_for_percentiles-585" > < a href = "#remove_within_group_for_percentiles-585" > < span class = "linenos" > 585< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PERCENTILES< / span > < span class = "p" > )< / span >
< / span > < span id = "remove_within_group_for_percentiles-586" > < a href = "#remove_within_group_for_percentiles-586" > < span class = "linenos" > 586< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Order< / span > < span class = "p" > )< / span >
< / span > < span id = "remove_within_group_for_percentiles-587" > < a href = "#remove_within_group_for_percentiles-587" > < span class = "linenos" > 587< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "remove_within_group_for_percentiles-588" > < a href = "#remove_within_group_for_percentiles-588" > < span class = "linenos" > 588< / span > < / a > < span class = "n" > quantile< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "remove_within_group_for_percentiles-589" > < a href = "#remove_within_group_for_percentiles-589" > < span class = "linenos" > 589< / span > < / a > < span class = "n" > input_value< / span > < span class = "o" > =< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > cast< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > ,< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Ordered< / span > < span class = "p" > ))< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "remove_within_group_for_percentiles-590" > < a href = "#remove_within_group_for_percentiles-590" > < span class = "linenos" > 590< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ApproxQuantile< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > input_value< / span > < span class = "p" > ,< / span > < span class = "n" > quantile< / span > < span class = "o" > =< / span > < span class = "n" > quantile< / span > < span class = "p" > ))< / span >
< / span > < span id = "remove_within_group_for_percentiles-591" > < a href = "#remove_within_group_for_percentiles-591" > < span class = "linenos" > 591< / span > < / a >
< / span > < span id = "remove_within_group_for_percentiles-592" > < a href = "#remove_within_group_for_percentiles-592" > < span class = "linenos" > 592< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:57:23 +01:00
< / span > < / pre > < / div >
2025-02-13 21:16:09 +01:00
< div class = "docstring" > < p > Transforms percentiles by getting rid of their corresponding WITHIN GROUP clause.< / p >
< / div >
2025-02-13 15:57:23 +01:00
< / section >
< section id = "add_recursive_cte_column_names" >
< input id = "add_recursive_cte_column_names-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > add_recursive_cte_column_names< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "add_recursive_cte_column_names-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#add_recursive_cte_column_names" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "add_recursive_cte_column_names-595" > < a href = "#add_recursive_cte_column_names-595" > < span class = "linenos" > 595< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > add_recursive_cte_column_names< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "add_recursive_cte_column_names-596" > < a href = "#add_recursive_cte_column_names-596" > < span class = "linenos" > 596< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Uses projection output names in recursive CTE definitions to define the CTEs' columns." " " < / span >
< / span > < span id = "add_recursive_cte_column_names-597" > < a href = "#add_recursive_cte_column_names-597" > < span class = "linenos" > 597< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > recursive< / span > < span class = "p" > :< / span >
< / span > < span id = "add_recursive_cte_column_names-598" > < a href = "#add_recursive_cte_column_names-598" > < span class = "linenos" > 598< / span > < / a > < span class = "n" > next_name< / span > < span class = "o" > =< / span > < span class = "n" > name_sequence< / span > < span class = "p" > (< / span > < span class = "s2" > " _c_" < / span > < span class = "p" > )< / span >
< / span > < span id = "add_recursive_cte_column_names-599" > < a href = "#add_recursive_cte_column_names-599" > < span class = "linenos" > 599< / span > < / a >
< / span > < span id = "add_recursive_cte_column_names-600" > < a href = "#add_recursive_cte_column_names-600" > < span class = "linenos" > 600< / span > < / a > < span class = "k" > for< / span > < span class = "n" > cte< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "add_recursive_cte_column_names-601" > < a href = "#add_recursive_cte_column_names-601" > < span class = "linenos" > 601< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > columns< / span > < span class = "p" > :< / span >
< / span > < span id = "add_recursive_cte_column_names-602" > < a href = "#add_recursive_cte_column_names-602" > < span class = "linenos" > 602< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "add_recursive_cte_column_names-603" > < a href = "#add_recursive_cte_column_names-603" > < span class = "linenos" > 603< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > query< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > SetOperation< / span > < span class = "p" > ):< / span >
< / span > < span id = "add_recursive_cte_column_names-604" > < a href = "#add_recursive_cte_column_names-604" > < span class = "linenos" > 604< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "add_recursive_cte_column_names-605" > < a href = "#add_recursive_cte_column_names-605" > < span class = "linenos" > 605< / span > < / a >
< / span > < span id = "add_recursive_cte_column_names-606" > < a href = "#add_recursive_cte_column_names-606" > < span class = "linenos" > 606< / span > < / a > < span class = "n" > cte< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "add_recursive_cte_column_names-607" > < a href = "#add_recursive_cte_column_names-607" > < span class = "linenos" > 607< / span > < / a > < span class = "s2" > " columns" < / span > < span class = "p" > ,< / span >
< / span > < span id = "add_recursive_cte_column_names-608" > < a href = "#add_recursive_cte_column_names-608" > < span class = "linenos" > 608< / span > < / a > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "ow" > or< / span > < span class = "n" > next_name< / span > < span class = "p" > ())< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span > < span class = "p" > ],< / span >
< / span > < span id = "add_recursive_cte_column_names-609" > < a href = "#add_recursive_cte_column_names-609" > < span class = "linenos" > 609< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "add_recursive_cte_column_names-610" > < a href = "#add_recursive_cte_column_names-610" > < span class = "linenos" > 610< / span > < / a >
< / span > < span id = "add_recursive_cte_column_names-611" > < a href = "#add_recursive_cte_column_names-611" > < span class = "linenos" > 611< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:58:40 +01:00
< / span > < / pre > < / div >
2025-02-13 21:16:09 +01:00
< div class = "docstring" > < p > Uses projection output names in recursive CTE definitions to define the CTEs' columns.< / p >
< / div >
2025-02-13 15:58:40 +01:00
< / section >
< section id = "epoch_cast_to_ts" >
< input id = "epoch_cast_to_ts-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > epoch_cast_to_ts< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "epoch_cast_to_ts-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#epoch_cast_to_ts" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "epoch_cast_to_ts-614" > < a href = "#epoch_cast_to_ts-614" > < span class = "linenos" > 614< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > epoch_cast_to_ts< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "epoch_cast_to_ts-615" > < a href = "#epoch_cast_to_ts-615" > < span class = "linenos" > 615< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Replace ' epoch' in casts by the equivalent date literal." " " < / span >
< / span > < span id = "epoch_cast_to_ts-616" > < a href = "#epoch_cast_to_ts-616" > < span class = "linenos" > 616< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "epoch_cast_to_ts-617" > < a href = "#epoch_cast_to_ts-617" > < span class = "linenos" > 617< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Cast< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TryCast< / span > < span class = "p" > ))< / span >
< / span > < span id = "epoch_cast_to_ts-618" > < a href = "#epoch_cast_to_ts-618" > < span class = "linenos" > 618< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ()< / span > < span class = "o" > ==< / span > < span class = "s2" > " epoch" < / span >
< / span > < span id = "epoch_cast_to_ts-619" > < a href = "#epoch_cast_to_ts-619" > < span class = "linenos" > 619< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > to< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > in< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > TEMPORAL_TYPES< / span >
< / span > < span id = "epoch_cast_to_ts-620" > < a href = "#epoch_cast_to_ts-620" > < span class = "linenos" > 620< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "epoch_cast_to_ts-621" > < a href = "#epoch_cast_to_ts-621" > < span class = "linenos" > 621< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Literal< / span > < span class = "o" > .< / span > < span class = "n" > string< / span > < span class = "p" > (< / span > < span class = "s2" > " 1970-01-01 00:00:00" < / span > < span class = "p" > ))< / span >
< / span > < span id = "epoch_cast_to_ts-622" > < a href = "#epoch_cast_to_ts-622" > < span class = "linenos" > 622< / span > < / a >
< / span > < span id = "epoch_cast_to_ts-623" > < a href = "#epoch_cast_to_ts-623" > < span class = "linenos" > 623< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:03:38 +01:00
< / span > < / pre > < / div >
2025-02-13 21:16:09 +01:00
< div class = "docstring" > < p > Replace 'epoch' in casts by the equivalent date literal.< / p >
< / div >
2025-02-13 21:03:38 +01:00
< / section >
< section id = "eliminate_semi_and_anti_joins" >
< input id = "eliminate_semi_and_anti_joins-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > eliminate_semi_and_anti_joins< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "eliminate_semi_and_anti_joins-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#eliminate_semi_and_anti_joins" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_semi_and_anti_joins-626" > < a href = "#eliminate_semi_and_anti_joins-626" > < span class = "linenos" > 626< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_semi_and_anti_joins< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-627" > < a href = "#eliminate_semi_and_anti_joins-627" > < span class = "linenos" > 627< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Convert SEMI and ANTI joins into equivalent forms that use EXIST instead." " " < / span >
< / span > < span id = "eliminate_semi_and_anti_joins-628" > < a href = "#eliminate_semi_and_anti_joins-628" > < span class = "linenos" > 628< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-629" > < a href = "#eliminate_semi_and_anti_joins-629" > < span class = "linenos" > 629< / span > < / a > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > []:< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-630" > < a href = "#eliminate_semi_and_anti_joins-630" > < span class = "linenos" > 630< / span > < / a > < span class = "n" > on< / span > < span class = "o" > =< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-631" > < a href = "#eliminate_semi_and_anti_joins-631" > < span class = "linenos" > 631< / span > < / a > < span class = "k" > if< / span > < span class = "n" > on< / span > < span class = "ow" > and< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "s2" > " SEMI" < / span > < span class = "p" > ,< / span > < span class = "s2" > " ANTI" < / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-632" > < a href = "#eliminate_semi_and_anti_joins-632" > < span class = "linenos" > 632< / span > < / a > < span class = "n" > subquery< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "s2" > " 1" < / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > on< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-633" > < a href = "#eliminate_semi_and_anti_joins-633" > < span class = "linenos" > 633< / span > < / a > < span class = "n" > exists< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > subquery< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-634" > < a href = "#eliminate_semi_and_anti_joins-634" > < span class = "linenos" > 634< / span > < / a > < span class = "k" > if< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "o" > ==< / span > < span class = "s2" > " ANTI" < / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-635" > < a href = "#eliminate_semi_and_anti_joins-635" > < span class = "linenos" > 635< / span > < / a > < span class = "n" > exists< / span > < span class = "o" > =< / span > < span class = "n" > exists< / span > < span class = "o" > .< / span > < span class = "n" > not_< / span > < span class = "p" > (< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-636" > < a href = "#eliminate_semi_and_anti_joins-636" > < span class = "linenos" > 636< / span > < / a >
< / span > < span id = "eliminate_semi_and_anti_joins-637" > < a href = "#eliminate_semi_and_anti_joins-637" > < span class = "linenos" > 637< / span > < / a > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-638" > < a href = "#eliminate_semi_and_anti_joins-638" > < span class = "linenos" > 638< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exists< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_semi_and_anti_joins-639" > < a href = "#eliminate_semi_and_anti_joins-639" > < span class = "linenos" > 639< / span > < / a >
< / span > < span id = "eliminate_semi_and_anti_joins-640" > < a href = "#eliminate_semi_and_anti_joins-640" > < span class = "linenos" > 640< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:57:23 +01:00
< / span > < / pre > < / div >
2025-02-13 21:16:09 +01:00
< div class = "docstring" > < p > Convert SEMI and ANTI joins into equivalent forms that use EXIST instead.< / p >
< / div >
< / section >
< section id = "eliminate_full_outer_join" >
< input id = "eliminate_full_outer_join-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > eliminate_full_outer_join< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "eliminate_full_outer_join-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#eliminate_full_outer_join" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_full_outer_join-643" > < a href = "#eliminate_full_outer_join-643" > < span class = "linenos" > 643< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_full_outer_join< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_full_outer_join-644" > < a href = "#eliminate_full_outer_join-644" > < span class = "linenos" > 644< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_full_outer_join-645" > < a href = "#eliminate_full_outer_join-645" > < span class = "linenos" > 645< / span > < / a > < span class = "sd" > Converts a query with a FULL OUTER join to a union of identical queries that< / span >
< / span > < span id = "eliminate_full_outer_join-646" > < a href = "#eliminate_full_outer_join-646" > < span class = "linenos" > 646< / span > < / a > < span class = "sd" > use LEFT/RIGHT OUTER joins instead. This transformation currently only works< / span >
< / span > < span id = "eliminate_full_outer_join-647" > < a href = "#eliminate_full_outer_join-647" > < span class = "linenos" > 647< / span > < / a > < span class = "sd" > for queries that have a single FULL OUTER join.< / span >
< / span > < span id = "eliminate_full_outer_join-648" > < a href = "#eliminate_full_outer_join-648" > < span class = "linenos" > 648< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_full_outer_join-649" > < a href = "#eliminate_full_outer_join-649" > < span class = "linenos" > 649< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_full_outer_join-650" > < a href = "#eliminate_full_outer_join-650" > < span class = "linenos" > 650< / span > < / a > < span class = "n" > full_outer_joins< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< / span > < span id = "eliminate_full_outer_join-651" > < a href = "#eliminate_full_outer_join-651" > < span class = "linenos" > 651< / span > < / a > < span class = "p" > (< / span > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > join< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-652" > < a href = "#eliminate_full_outer_join-652" > < span class = "linenos" > 652< / span > < / a > < span class = "k" > for< / span > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "p" > [])< / span >
< / span > < span id = "eliminate_full_outer_join-653" > < a href = "#eliminate_full_outer_join-653" > < span class = "linenos" > 653< / span > < / a > < span class = "k" > if< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > side< / span > < span class = "o" > ==< / span > < span class = "s2" > " FULL" < / span >
< / span > < span id = "eliminate_full_outer_join-654" > < a href = "#eliminate_full_outer_join-654" > < span class = "linenos" > 654< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "eliminate_full_outer_join-655" > < a href = "#eliminate_full_outer_join-655" > < span class = "linenos" > 655< / span > < / a >
< / span > < span id = "eliminate_full_outer_join-656" > < a href = "#eliminate_full_outer_join-656" > < span class = "linenos" > 656< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > full_outer_joins< / span > < span class = "p" > )< / span > < span class = "o" > ==< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_full_outer_join-657" > < a href = "#eliminate_full_outer_join-657" > < span class = "linenos" > 657< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_full_outer_join-658" > < a href = "#eliminate_full_outer_join-658" > < span class = "linenos" > 658< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " limit" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-659" > < a href = "#eliminate_full_outer_join-659" > < span class = "linenos" > 659< / span > < / a > < span class = "n" > index< / span > < span class = "p" > ,< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > =< / span > < span class = "n" > full_outer_joins< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "eliminate_full_outer_join-660" > < a href = "#eliminate_full_outer_join-660" > < span class = "linenos" > 660< / span > < / a >
< / span > < span id = "eliminate_full_outer_join-661" > < a href = "#eliminate_full_outer_join-661" > < span class = "linenos" > 661< / span > < / a > < span class = "n" > tables< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ,< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-662" > < a href = "#eliminate_full_outer_join-662" > < span class = "linenos" > 662< / span > < / a > < span class = "n" > join_conditions< / span > < span class = "o" > =< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " on" < / span > < span class = "p" > )< / span > < span class = "ow" > or< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_full_outer_join-663" > < a href = "#eliminate_full_outer_join-663" > < span class = "linenos" > 663< / span > < / a > < span class = "o" > *< / span > < span class = "p" > [< / span >
< / span > < span id = "eliminate_full_outer_join-664" > < a href = "#eliminate_full_outer_join-664" > < span class = "linenos" > 664< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "p" > ,< / span > < span class = "n" > tables< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span > < span class = "o" > .< / span > < span class = "n" > eq< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > column< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "p" > ,< / span > < span class = "n" > tables< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > ]))< / span >
< / span > < span id = "eliminate_full_outer_join-665" > < a href = "#eliminate_full_outer_join-665" > < span class = "linenos" > 665< / span > < / a > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " using" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-666" > < a href = "#eliminate_full_outer_join-666" > < span class = "linenos" > 666< / span > < / a > < span class = "p" > ]< / span >
< / span > < span id = "eliminate_full_outer_join-667" > < a href = "#eliminate_full_outer_join-667" > < span class = "linenos" > 667< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-668" > < a href = "#eliminate_full_outer_join-668" > < span class = "linenos" > 668< / span > < / a >
< / span > < span id = "eliminate_full_outer_join-669" > < a href = "#eliminate_full_outer_join-669" > < span class = "linenos" > 669< / span > < / a > < span class = "n" > full_outer_join< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " side" < / span > < span class = "p" > ,< / span > < span class = "s2" > " left" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-670" > < a href = "#eliminate_full_outer_join-670" > < span class = "linenos" > 670< / span > < / a > < span class = "n" > anti_join_clause< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "s2" > " 1" < / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > from_< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ])< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > join_conditions< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-671" > < a href = "#eliminate_full_outer_join-671" > < span class = "linenos" > 671< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ][< / span > < span class = "n" > index< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " side" < / span > < span class = "p" > ,< / span > < span class = "s2" > " right" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-672" > < a href = "#eliminate_full_outer_join-672" > < span class = "linenos" > 672< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > =< / span > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > anti_join_clause< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > not_< / span > < span class = "p" > ())< / span >
< / span > < span id = "eliminate_full_outer_join-673" > < a href = "#eliminate_full_outer_join-673" > < span class = "linenos" > 673< / span > < / a > < span class = "n" > expression_copy< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span > < span class = "c1" > # remove CTEs from RIGHT side< / span >
< / span > < span id = "eliminate_full_outer_join-674" > < a href = "#eliminate_full_outer_join-674" > < span class = "linenos" > 674< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > (< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span > < span class = "c1" > # remove order by from LEFT side< / span >
< / span > < span id = "eliminate_full_outer_join-675" > < a href = "#eliminate_full_outer_join-675" > < span class = "linenos" > 675< / span > < / a >
< / span > < span id = "eliminate_full_outer_join-676" > < a href = "#eliminate_full_outer_join-676" > < span class = "linenos" > 676< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > union< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > expression_copy< / span > < span class = "p" > ,< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > ,< / span > < span class = "n" > distinct< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_full_outer_join-677" > < a href = "#eliminate_full_outer_join-677" > < span class = "linenos" > 677< / span > < / a >
< / span > < span id = "eliminate_full_outer_join-678" > < a href = "#eliminate_full_outer_join-678" > < span class = "linenos" > 678< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:16:09 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Converts a query with a FULL OUTER join to a union of identical queries that
use LEFT/RIGHT OUTER joins instead. This transformation currently only works
for queries that have a single FULL OUTER join.< / p >
< / div >
< / section >
< section id = "move_ctes_to_top_level" >
< input id = "move_ctes_to_top_level-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
2025-02-13 21:55:40 +01:00
< span class = "name" > move_ctes_to_top_level< / span > < span class = "signature pdoc-code condensed" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "o" > ~< / span > < span class = "n" > E< / span > < / span > < span class = "return-annotation" > ) -> < span class = "o" > ~< / span > < span class = "n" > E< / span > :< / span > < / span >
2025-02-13 21:16:09 +01:00
< label class = "view-source-button" for = "move_ctes_to_top_level-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#move_ctes_to_top_level" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "move_ctes_to_top_level-681" > < a href = "#move_ctes_to_top_level-681" > < span class = "linenos" > 681< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_ctes_to_top_level< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > E< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > E< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-682" > < a href = "#move_ctes_to_top_level-682" > < span class = "linenos" > 682< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "move_ctes_to_top_level-683" > < a href = "#move_ctes_to_top_level-683" > < span class = "linenos" > 683< / span > < / a > < span class = "sd" > Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be< / span >
< / span > < span id = "move_ctes_to_top_level-684" > < a href = "#move_ctes_to_top_level-684" > < span class = "linenos" > 684< / span > < / a > < span class = "sd" > defined at the top-level, so for example queries like:< / span >
< / span > < span id = "move_ctes_to_top_level-685" > < a href = "#move_ctes_to_top_level-685" > < span class = "linenos" > 685< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-686" > < a href = "#move_ctes_to_top_level-686" > < span class = "linenos" > 686< / span > < / a > < span class = "sd" > SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq< / span >
< / span > < span id = "move_ctes_to_top_level-687" > < a href = "#move_ctes_to_top_level-687" > < span class = "linenos" > 687< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-688" > < a href = "#move_ctes_to_top_level-688" > < span class = "linenos" > 688< / span > < / a > < span class = "sd" > are invalid in those dialects. This transformation can be used to ensure all CTEs are< / span >
< / span > < span id = "move_ctes_to_top_level-689" > < a href = "#move_ctes_to_top_level-689" > < span class = "linenos" > 689< / span > < / a > < span class = "sd" > moved to the top level so that the final SQL code is valid from a syntax standpoint.< / span >
< / span > < span id = "move_ctes_to_top_level-690" > < a href = "#move_ctes_to_top_level-690" > < span class = "linenos" > 690< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-691" > < a href = "#move_ctes_to_top_level-691" > < span class = "linenos" > 691< / span > < / a > < span class = "sd" > TODO: handle name clashes whilst moving CTEs (it can get quite tricky & costly).< / span >
< / span > < span id = "move_ctes_to_top_level-692" > < a href = "#move_ctes_to_top_level-692" > < span class = "linenos" > 692< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "move_ctes_to_top_level-693" > < a href = "#move_ctes_to_top_level-693" > < span class = "linenos" > 693< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-694" > < a href = "#move_ctes_to_top_level-694" > < span class = "linenos" > 694< / span > < / a > < span class = "k" > for< / span > < span class = "n" > inner_with< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > With< / span > < span class = "p" > ):< / span >
< / span > < span id = "move_ctes_to_top_level-695" > < a href = "#move_ctes_to_top_level-695" > < span class = "linenos" > 695< / span > < / a > < span class = "k" > if< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "ow" > is< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-696" > < a href = "#move_ctes_to_top_level-696" > < span class = "linenos" > 696< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "move_ctes_to_top_level-697" > < a href = "#move_ctes_to_top_level-697" > < span class = "linenos" > 697< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-698" > < a href = "#move_ctes_to_top_level-698" > < span class = "linenos" > 698< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > top_level_with< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-699" > < a href = "#move_ctes_to_top_level-699" > < span class = "linenos" > 699< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "move_ctes_to_top_level-700" > < a href = "#move_ctes_to_top_level-700" > < span class = "linenos" > 700< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " with" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-701" > < a href = "#move_ctes_to_top_level-701" > < span class = "linenos" > 701< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-702" > < a href = "#move_ctes_to_top_level-702" > < span class = "linenos" > 702< / span > < / a > < span class = "k" > if< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > recursive< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-703" > < a href = "#move_ctes_to_top_level-703" > < span class = "linenos" > 703< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " recursive" < / span > < span class = "p" > ,< / span > < span class = "kc" > True< / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-704" > < a href = "#move_ctes_to_top_level-704" > < span class = "linenos" > 704< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-705" > < a href = "#move_ctes_to_top_level-705" > < span class = "linenos" > 705< / span > < / a > < span class = "n" > parent_cte< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > find_ancestor< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > CTE< / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-706" > < a href = "#move_ctes_to_top_level-706" > < span class = "linenos" > 706< / span > < / a > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "move_ctes_to_top_level-707" > < a href = "#move_ctes_to_top_level-707" > < span class = "linenos" > 707< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-708" > < a href = "#move_ctes_to_top_level-708" > < span class = "linenos" > 708< / span > < / a > < span class = "k" > if< / span > < span class = "n" > parent_cte< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-709" > < a href = "#move_ctes_to_top_level-709" > < span class = "linenos" > 709< / span > < / a > < span class = "n" > i< / span > < span class = "o" > =< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "o" > .< / span > < span class = "n" > index< / span > < span class = "p" > (< / span > < span class = "n" > parent_cte< / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-710" > < a href = "#move_ctes_to_top_level-710" > < span class = "linenos" > 710< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > :< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "move_ctes_to_top_level-711" > < a href = "#move_ctes_to_top_level-711" > < span class = "linenos" > 711< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-712" > < a href = "#move_ctes_to_top_level-712" > < span class = "linenos" > 712< / span > < / a > < span class = "k" > else< / span > < span class = "p" > :< / span >
< / span > < span id = "move_ctes_to_top_level-713" > < a href = "#move_ctes_to_top_level-713" > < span class = "linenos" > 713< / span > < / a > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "move_ctes_to_top_level-714" > < a href = "#move_ctes_to_top_level-714" > < span class = "linenos" > 714< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > top_level_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "o" > +< / span > < span class = "n" > inner_with< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "move_ctes_to_top_level-715" > < a href = "#move_ctes_to_top_level-715" > < span class = "linenos" > 715< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "move_ctes_to_top_level-716" > < a href = "#move_ctes_to_top_level-716" > < span class = "linenos" > 716< / span > < / a >
< / span > < span id = "move_ctes_to_top_level-717" > < a href = "#move_ctes_to_top_level-717" > < span class = "linenos" > 717< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:16:09 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Some dialects (e.g. Hive, T-SQL, Spark prior to version 3) only allow CTEs to be
defined at the top-level, so for example queries like:< / p >
< pre > < code > SELECT * FROM (WITH t(c) AS (SELECT 1) SELECT * FROM t) AS subq
< / code > < / pre >
< p > are invalid in those dialects. This transformation can be used to ensure all CTEs are
moved to the top level so that the final SQL code is valid from a syntax standpoint.< / p >
< p > TODO: handle name clashes whilst moving CTEs (it can get quite tricky & costly).< / p >
< / div >
2025-02-13 15:57:23 +01:00
2025-02-13 21:17:09 +01:00
< / section >
< section id = "ensure_bools" >
< input id = "ensure_bools-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > ensure_bools< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "ensure_bools-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#ensure_bools" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "ensure_bools-720" > < a href = "#ensure_bools-720" > < span class = "linenos" > 720< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > ensure_bools< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "ensure_bools-721" > < a href = "#ensure_bools-721" > < span class = "linenos" > 721< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Converts numeric values used in conditions into explicit boolean expressions." " " < / span >
< / span > < span id = "ensure_bools-722" > < a href = "#ensure_bools-722" > < span class = "linenos" > 722< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.canonicalize< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > ensure_bools< / span >
< / span > < span id = "ensure_bools-723" > < a href = "#ensure_bools-723" > < span class = "linenos" > 723< / span > < / a >
< / span > < span id = "ensure_bools-724" > < a href = "#ensure_bools-724" > < span class = "linenos" > 724< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _ensure_bool< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< / span > < span id = "ensure_bools-725" > < a href = "#ensure_bools-725" > < span class = "linenos" > 725< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "ensure_bools-726" > < a href = "#ensure_bools-726" > < span class = "linenos" > 726< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > is_number< / span >
< / span > < span id = "ensure_bools-727" > < a href = "#ensure_bools-727" > < span class = "linenos" > 727< / span > < / a > < span class = "ow" > or< / span > < span class = "p" > (< / span >
< / span > < span id = "ensure_bools-728" > < a href = "#ensure_bools-728" > < span class = "linenos" > 728< / span > < / a > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > SubqueryPredicate< / span > < span class = "p" > )< / span >
< / span > < span id = "ensure_bools-729" > < a href = "#ensure_bools-729" > < span class = "linenos" > 729< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > is_type< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > Type< / span > < span class = "o" > .< / span > < span class = "n" > UNKNOWN< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "o" > .< / span > < span class = "n" > NUMERIC_TYPES< / span > < span class = "p" > )< / span >
< / span > < span id = "ensure_bools-730" > < a href = "#ensure_bools-730" > < span class = "linenos" > 730< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "ensure_bools-731" > < a href = "#ensure_bools-731" > < span class = "linenos" > 731< / span > < / a > < span class = "ow" > or< / span > < span class = "p" > (< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > type< / span > < span class = "p" > )< / span >
< / span > < span id = "ensure_bools-732" > < a href = "#ensure_bools-732" > < span class = "linenos" > 732< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "ensure_bools-733" > < a href = "#ensure_bools-733" > < span class = "linenos" > 733< / span > < / a > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > neq< / span > < span class = "p" > (< / span > < span class = "mi" > 0< / span > < span class = "p" > ))< / span >
< / span > < span id = "ensure_bools-734" > < a href = "#ensure_bools-734" > < span class = "linenos" > 734< / span > < / a >
< / span > < span id = "ensure_bools-735" > < a href = "#ensure_bools-735" > < span class = "linenos" > 735< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > walk< / span > < span class = "p" > ():< / span >
< / span > < span id = "ensure_bools-736" > < a href = "#ensure_bools-736" > < span class = "linenos" > 736< / span > < / a > < span class = "n" > ensure_bools< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > _ensure_bool< / span > < span class = "p" > )< / span >
< / span > < span id = "ensure_bools-737" > < a href = "#ensure_bools-737" > < span class = "linenos" > 737< / span > < / a >
< / span > < span id = "ensure_bools-738" > < a href = "#ensure_bools-738" > < span class = "linenos" > 738< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:17:09 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Converts numeric values used in conditions into explicit boolean expressions.< / p >
< / div >
< / section >
< section id = "unqualify_columns" >
< input id = "unqualify_columns-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unqualify_columns< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unqualify_columns-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unqualify_columns" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unqualify_columns-741" > < a href = "#unqualify_columns-741" > < span class = "linenos" > 741< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unqualify_columns< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "unqualify_columns-742" > < a href = "#unqualify_columns-742" > < span class = "linenos" > 742< / span > < / a > < span class = "k" > for< / span > < span class = "n" > column< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > ):< / span >
< / span > < span id = "unqualify_columns-743" > < a href = "#unqualify_columns-743" > < span class = "linenos" > 743< / span > < / a > < span class = "c1" > # We only wanna pop off the table, db, catalog args< / span >
< / span > < span id = "unqualify_columns-744" > < a href = "#unqualify_columns-744" > < span class = "linenos" > 744< / span > < / a > < span class = "k" > for< / span > < span class = "n" > part< / span > < span class = "ow" > in< / span > < span class = "n" > column< / span > < span class = "o" > .< / span > < span class = "n" > parts< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]:< / span >
< / span > < span id = "unqualify_columns-745" > < a href = "#unqualify_columns-745" > < span class = "linenos" > 745< / span > < / a > < span class = "n" > part< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "unqualify_columns-746" > < a href = "#unqualify_columns-746" > < span class = "linenos" > 746< / span > < / a >
< / span > < span id = "unqualify_columns-747" > < a href = "#unqualify_columns-747" > < span class = "linenos" > 747< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:27:51 +01:00
< / span > < / pre > < / div >
< / section >
< section id = "remove_unique_constraints" >
< input id = "remove_unique_constraints-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > remove_unique_constraints< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "remove_unique_constraints-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#remove_unique_constraints" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "remove_unique_constraints-750" > < a href = "#remove_unique_constraints-750" > < span class = "linenos" > 750< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > remove_unique_constraints< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "remove_unique_constraints-751" > < a href = "#remove_unique_constraints-751" > < span class = "linenos" > 751< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "remove_unique_constraints-752" > < a href = "#remove_unique_constraints-752" > < span class = "linenos" > 752< / span > < / a > < span class = "k" > for< / span > < span class = "n" > constraint< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > UniqueColumnConstraint< / span > < span class = "p" > ):< / span >
< / span > < span id = "remove_unique_constraints-753" > < a href = "#remove_unique_constraints-753" > < span class = "linenos" > 753< / span > < / a > < span class = "k" > if< / span > < span class = "n" > constraint< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > :< / span >
< / span > < span id = "remove_unique_constraints-754" > < a href = "#remove_unique_constraints-754" > < span class = "linenos" > 754< / span > < / a > < span class = "n" > constraint< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "remove_unique_constraints-755" > < a href = "#remove_unique_constraints-755" > < span class = "linenos" > 755< / span > < / a >
< / span > < span id = "remove_unique_constraints-756" > < a href = "#remove_unique_constraints-756" > < span class = "linenos" > 756< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:17:09 +01:00
< / span > < / pre > < / div >
2025-02-13 21:27:51 +01:00
< / section >
< section id = "ctas_with_tmp_tables_to_create_tmp_view" >
< input id = "ctas_with_tmp_tables_to_create_tmp_view-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > ctas_with_tmp_tables_to_create_tmp_view< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > ,< / span > < span class = "param" > < span class = "n" > tmp_storage_provider< / span > < span class = "p" > :< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ],< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "o" > < < / span > < span class = "n" > function< / span > < span class = "o" > < < / span > < span class = "k" > lambda< / span > < span class = "o" > > > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "ctas_with_tmp_tables_to_create_tmp_view-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#ctas_with_tmp_tables_to_create_tmp_view" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-759" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-759" > < span class = "linenos" > 759< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > ctas_with_tmp_tables_to_create_tmp_view< / span > < span class = "p" > (< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-760" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-760" > < span class = "linenos" > 760< / span > < / a > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-761" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-761" > < span class = "linenos" > 761< / span > < / a > < span class = "n" > tmp_storage_provider< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ],< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "k" > lambda< / span > < span class = "n" > e< / span > < span class = "p" > :< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-762" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-762" > < span class = "linenos" > 762< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-763" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-763" > < span class = "linenos" > 763< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-764" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-764" > < span class = "linenos" > 764< / span > < / a > < span class = "n" > properties< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " properties" < / span > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-765" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-765" > < span class = "linenos" > 765< / span > < / a > < span class = "n" > temporary< / span > < span class = "o" > =< / span > < span class = "nb" > any< / span > < span class = "p" > (< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-766" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-766" > < span class = "linenos" > 766< / span > < / a > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > TemporaryProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-767" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-767" > < span class = "linenos" > 767< / span > < / a > < span class = "k" > for< / span > < span class = "n" > prop< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "n" > properties< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > properties< / span > < span class = "k" > else< / span > < span class = "p" > [])< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-768" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-768" > < span class = "linenos" > 768< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-769" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-769" > < span class = "linenos" > 769< / span > < / a >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-770" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-770" > < span class = "linenos" > 770< / span > < / a > < span class = "c1" > # CTAS with temp tables map to CREATE TEMPORARY VIEW< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-771" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-771" > < span class = "linenos" > 771< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "o" > ==< / span > < span class = "s2" > " TABLE" < / span > < span class = "ow" > and< / span > < span class = "n" > temporary< / span > < span class = "p" > :< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-772" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-772" > < span class = "linenos" > 772< / span > < / a > < span class = "k" > if< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-773" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-773" > < span class = "linenos" > 773< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > (< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-774" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-774" > < span class = "linenos" > 774< / span > < / a > < span class = "n" > kind< / span > < span class = "o" > =< / span > < span class = "s2" > " TEMPORARY VIEW" < / span > < span class = "p" > ,< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-775" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-775" > < span class = "linenos" > 775< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-776" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-776" > < span class = "linenos" > 776< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-777" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-777" > < span class = "linenos" > 777< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-778" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-778" > < span class = "linenos" > 778< / span > < / a > < span class = "k" > return< / span > < span class = "n" > tmp_storage_provider< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-779" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-779" > < span class = "linenos" > 779< / span > < / a >
< / span > < span id = "ctas_with_tmp_tables_to_create_tmp_view-780" > < a href = "#ctas_with_tmp_tables_to_create_tmp_view-780" > < span class = "linenos" > 780< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:27:51 +01:00
< / span > < / pre > < / div >
< / section >
< section id = "move_schema_columns_to_partitioned_by" >
< input id = "move_schema_columns_to_partitioned_by-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > move_schema_columns_to_partitioned_by< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "move_schema_columns_to_partitioned_by-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#move_schema_columns_to_partitioned_by" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "move_schema_columns_to_partitioned_by-783" > < a href = "#move_schema_columns_to_partitioned_by-783" > < span class = "linenos" > 783< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_schema_columns_to_partitioned_by< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-784" > < a href = "#move_schema_columns_to_partitioned_by-784" > < span class = "linenos" > 784< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-785" > < a href = "#move_schema_columns_to_partitioned_by-785" > < span class = "linenos" > 785< / span > < / a > < span class = "sd" > In Hive, the PARTITIONED BY property acts as an extension of a table' s schema. When the< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-786" > < a href = "#move_schema_columns_to_partitioned_by-786" > < span class = "linenos" > 786< / span > < / a > < span class = "sd" > PARTITIONED BY value is an array of column names, they are transformed into a schema.< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-787" > < a href = "#move_schema_columns_to_partitioned_by-787" > < span class = "linenos" > 787< / span > < / a > < span class = "sd" > The corresponding columns are removed from the create statement.< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-788" > < a href = "#move_schema_columns_to_partitioned_by-788" > < span class = "linenos" > 788< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-789" > < a href = "#move_schema_columns_to_partitioned_by-789" > < span class = "linenos" > 789< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-790" > < a href = "#move_schema_columns_to_partitioned_by-790" > < span class = "linenos" > 790< / span > < / a > < span class = "n" > has_schema< / span > < span class = "o" > =< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > )< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-791" > < a href = "#move_schema_columns_to_partitioned_by-791" > < span class = "linenos" > 791< / span > < / a > < span class = "n" > is_partitionable< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "ow" > in< / span > < span class = "p" > {< / span > < span class = "s2" > " TABLE" < / span > < span class = "p" > ,< / span > < span class = "s2" > " VIEW" < / span > < span class = "p" > }< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-792" > < a href = "#move_schema_columns_to_partitioned_by-792" > < span class = "linenos" > 792< / span > < / a >
< / span > < span id = "move_schema_columns_to_partitioned_by-793" > < a href = "#move_schema_columns_to_partitioned_by-793" > < span class = "linenos" > 793< / span > < / a > < span class = "k" > if< / span > < span class = "n" > has_schema< / span > < span class = "ow" > and< / span > < span class = "n" > is_partitionable< / span > < span class = "p" > :< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-794" > < a href = "#move_schema_columns_to_partitioned_by-794" > < span class = "linenos" > 794< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-795" > < a href = "#move_schema_columns_to_partitioned_by-795" > < span class = "linenos" > 795< / span > < / a > < span class = "k" > if< / span > < span class = "n" > prop< / span > < span class = "ow" > and< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "ow" > and< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > ):< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-796" > < a href = "#move_schema_columns_to_partitioned_by-796" > < span class = "linenos" > 796< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-797" > < a href = "#move_schema_columns_to_partitioned_by-797" > < span class = "linenos" > 797< / span > < / a > < span class = "n" > columns< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > v< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > upper< / span > < span class = "p" > ()< / span > < span class = "k" > for< / span > < span class = "n" > v< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > }< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-798" > < a href = "#move_schema_columns_to_partitioned_by-798" > < span class = "linenos" > 798< / span > < / a > < span class = "n" > partitions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > col< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > upper< / span > < span class = "p" > ()< / span > < span class = "ow" > in< / span > < span class = "n" > columns< / span > < span class = "p" > ]< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-799" > < a href = "#move_schema_columns_to_partitioned_by-799" > < span class = "linenos" > 799< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "p" > [< / span > < span class = "n" > e< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "k" > if< / span > < span class = "n" > e< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > partitions< / span > < span class = "p" > ])< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-800" > < a href = "#move_schema_columns_to_partitioned_by-800" > < span class = "linenos" > 800< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > (< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "n" > partitions< / span > < span class = "p" > )))< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-801" > < a href = "#move_schema_columns_to_partitioned_by-801" > < span class = "linenos" > 801< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > schema< / span > < span class = "p" > )< / span >
< / span > < span id = "move_schema_columns_to_partitioned_by-802" > < a href = "#move_schema_columns_to_partitioned_by-802" > < span class = "linenos" > 802< / span > < / a >
< / span > < span id = "move_schema_columns_to_partitioned_by-803" > < a href = "#move_schema_columns_to_partitioned_by-803" > < span class = "linenos" > 803< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:27:51 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > In Hive, the PARTITIONED BY property acts as an extension of a table's schema. When the
PARTITIONED BY value is an array of column names, they are transformed into a schema.
The corresponding columns are removed from the create statement.< / p >
< / div >
< / section >
< section id = "move_partitioned_by_to_schema_columns" >
< input id = "move_partitioned_by_to_schema_columns-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > move_partitioned_by_to_schema_columns< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "move_partitioned_by_to_schema_columns-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#move_partitioned_by_to_schema_columns" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "move_partitioned_by_to_schema_columns-806" > < a href = "#move_partitioned_by_to_schema_columns-806" > < span class = "linenos" > 806< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > move_partitioned_by_to_schema_columns< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-807" > < a href = "#move_partitioned_by_to_schema_columns-807" > < span class = "linenos" > 807< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-808" > < a href = "#move_partitioned_by_to_schema_columns-808" > < span class = "linenos" > 808< / span > < / a > < span class = "sd" > Spark 3 supports both " HIVEFORMAT" and " DATASOURCE" formats for CREATE TABLE.< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-809" > < a href = "#move_partitioned_by_to_schema_columns-809" > < span class = "linenos" > 809< / span > < / a >
< / span > < span id = "move_partitioned_by_to_schema_columns-810" > < a href = "#move_partitioned_by_to_schema_columns-810" > < span class = "linenos" > 810< / span > < / a > < span class = "sd" > Currently, SQLGlot uses the DATASOURCE format for Spark 3.< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-811" > < a href = "#move_partitioned_by_to_schema_columns-811" > < span class = "linenos" > 811< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-812" > < a href = "#move_partitioned_by_to_schema_columns-812" > < span class = "linenos" > 812< / span > < / a > < span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Create< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-813" > < a href = "#move_partitioned_by_to_schema_columns-813" > < span class = "linenos" > 813< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PartitionedByProperty< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-814" > < a href = "#move_partitioned_by_to_schema_columns-814" > < span class = "linenos" > 814< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-815" > < a href = "#move_partitioned_by_to_schema_columns-815" > < span class = "linenos" > 815< / span > < / a > < span class = "n" > prop< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-816" > < a href = "#move_partitioned_by_to_schema_columns-816" > < span class = "linenos" > 816< / span > < / a > < span class = "ow" > and< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-817" > < a href = "#move_partitioned_by_to_schema_columns-817" > < span class = "linenos" > 817< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Schema< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-818" > < a href = "#move_partitioned_by_to_schema_columns-818" > < span class = "linenos" > 818< / span > < / a > < span class = "ow" > and< / span > < span class = "nb" > all< / span > < span class = "p" > (< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > ColumnDef< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-819" > < a href = "#move_partitioned_by_to_schema_columns-819" > < span class = "linenos" > 819< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-820" > < a href = "#move_partitioned_by_to_schema_columns-820" > < span class = "linenos" > 820< / span > < / a > < span class = "n" > prop_this< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Tuple< / span > < span class = "p" > (< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-821" > < a href = "#move_partitioned_by_to_schema_columns-821" > < span class = "linenos" > 821< / span > < / a > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > ]< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-822" > < a href = "#move_partitioned_by_to_schema_columns-822" > < span class = "linenos" > 822< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-823" > < a href = "#move_partitioned_by_to_schema_columns-823" > < span class = "linenos" > 823< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-824" > < a href = "#move_partitioned_by_to_schema_columns-824" > < span class = "linenos" > 824< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span > < span class = "p" > :< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-825" > < a href = "#move_partitioned_by_to_schema_columns-825" > < span class = "linenos" > 825< / span > < / a > < span class = "n" > schema< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-826" > < a href = "#move_partitioned_by_to_schema_columns-826" > < span class = "linenos" > 826< / span > < / a > < span class = "n" > prop< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " this" < / span > < span class = "p" > ,< / span > < span class = "n" > prop_this< / span > < span class = "p" > )< / span >
< / span > < span id = "move_partitioned_by_to_schema_columns-827" > < a href = "#move_partitioned_by_to_schema_columns-827" > < span class = "linenos" > 827< / span > < / a >
< / span > < span id = "move_partitioned_by_to_schema_columns-828" > < a href = "#move_partitioned_by_to_schema_columns-828" > < span class = "linenos" > 828< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:27:51 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Spark 3 supports both "HIVEFORMAT" and "DATASOURCE" formats for CREATE TABLE.< / p >
< p > Currently, SQLGlot uses the DATASOURCE format for Spark 3.< / p >
< / div >
2025-02-13 21:29:39 +01:00
< / section >
< section id = "struct_kv_to_alias" >
< input id = "struct_kv_to_alias-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > struct_kv_to_alias< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "struct_kv_to_alias-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#struct_kv_to_alias" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "struct_kv_to_alias-831" > < a href = "#struct_kv_to_alias-831" > < span class = "linenos" > 831< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > struct_kv_to_alias< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "struct_kv_to_alias-832" > < a href = "#struct_kv_to_alias-832" > < span class = "linenos" > 832< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Converts struct arguments to aliases, e.g. STRUCT(1 AS y)." " " < / span >
< / span > < span id = "struct_kv_to_alias-833" > < a href = "#struct_kv_to_alias-833" > < span class = "linenos" > 833< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Struct< / span > < span class = "p" > ):< / span >
< / span > < span id = "struct_kv_to_alias-834" > < a href = "#struct_kv_to_alias-834" > < span class = "linenos" > 834< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span >
< / span > < span id = "struct_kv_to_alias-835" > < a href = "#struct_kv_to_alias-835" > < span class = "linenos" > 835< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > ,< / span >
< / span > < span id = "struct_kv_to_alias-836" > < a href = "#struct_kv_to_alias-836" > < span class = "linenos" > 836< / span > < / a > < span class = "p" > [< / span >
< / span > < span id = "struct_kv_to_alias-837" > < a href = "#struct_kv_to_alias-837" > < span class = "linenos" > 837< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > alias_< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > e< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > e< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > PropertyEQ< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "n" > e< / span >
< / span > < span id = "struct_kv_to_alias-838" > < a href = "#struct_kv_to_alias-838" > < span class = "linenos" > 838< / span > < / a > < span class = "k" > for< / span > < span class = "n" > e< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "struct_kv_to_alias-839" > < a href = "#struct_kv_to_alias-839" > < span class = "linenos" > 839< / span > < / a > < span class = "p" > ],< / span >
< / span > < span id = "struct_kv_to_alias-840" > < a href = "#struct_kv_to_alias-840" > < span class = "linenos" > 840< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "struct_kv_to_alias-841" > < a href = "#struct_kv_to_alias-841" > < span class = "linenos" > 841< / span > < / a >
< / span > < span id = "struct_kv_to_alias-842" > < a href = "#struct_kv_to_alias-842" > < span class = "linenos" > 842< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:29:39 +01:00
< / span > < / pre > < / div >
2025-02-13 21:30:28 +01:00
< div class = "docstring" > < p > Converts struct arguments to aliases, e.g. STRUCT(1 AS y).< / p >
2025-02-13 21:29:39 +01:00
< / div >
2025-02-13 15:23:26 +01:00
< / section >
2025-02-13 21:41:14 +01:00
< section id = "eliminate_join_marks" >
< input id = "eliminate_join_marks-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
2025-02-13 15:23:26 +01:00
< div class = "attr function" >
< span class = "def" > def< / span >
2025-02-13 21:41:14 +01:00
< span class = "name" > eliminate_join_marks< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
2025-02-13 15:23:26 +01:00
2025-02-13 21:41:14 +01:00
< label class = "view-source-button" for = "eliminate_join_marks-view-source" > < span > View Source< / span > < / label >
2025-02-13 15:23:26 +01:00
< / div >
2025-02-13 21:41:14 +01:00
< a class = "headerlink" href = "#eliminate_join_marks" > < / a >
2025-05-24 07:15:28 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_join_marks-845" > < a href = "#eliminate_join_marks-845" > < span class = "linenos" > 845< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_join_marks< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-846" > < a href = "#eliminate_join_marks-846" > < span class = "linenos" > 846< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178< / span >
< / span > < span id = "eliminate_join_marks-847" > < a href = "#eliminate_join_marks-847" > < span class = "linenos" > 847< / span > < / a >
< / span > < span id = "eliminate_join_marks-848" > < a href = "#eliminate_join_marks-848" > < span class = "linenos" > 848< / span > < / a > < span class = "sd" > 1. You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-849" > < a href = "#eliminate_join_marks-849" > < span class = "linenos" > 849< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-850" > < a href = "#eliminate_join_marks-850" > < span class = "linenos" > 850< / span > < / a > < span class = "sd" > 2. The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.< / span >
< / span > < span id = "eliminate_join_marks-851" > < a href = "#eliminate_join_marks-851" > < span class = "linenos" > 851< / span > < / a >
< / span > < span id = "eliminate_join_marks-852" > < a href = "#eliminate_join_marks-852" > < span class = "linenos" > 852< / span > < / a > < span class = "sd" > The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-853" > < a href = "#eliminate_join_marks-853" > < span class = "linenos" > 853< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-854" > < a href = "#eliminate_join_marks-854" > < span class = "linenos" > 854< / span > < / a > < span class = "sd" > You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.< / span >
< / span > < span id = "eliminate_join_marks-855" > < a href = "#eliminate_join_marks-855" > < span class = "linenos" > 855< / span > < / a >
< / span > < span id = "eliminate_join_marks-856" > < a href = "#eliminate_join_marks-856" > < span class = "linenos" > 856< / span > < / a > < span class = "sd" > The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.< / span >
< / span > < span id = "eliminate_join_marks-857" > < a href = "#eliminate_join_marks-857" > < span class = "linenos" > 857< / span > < / a >
< / span > < span id = "eliminate_join_marks-858" > < a href = "#eliminate_join_marks-858" > < span class = "linenos" > 858< / span > < / a > < span class = "sd" > A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.< / span >
< / span > < span id = "eliminate_join_marks-859" > < a href = "#eliminate_join_marks-859" > < span class = "linenos" > 859< / span > < / a >
< / span > < span id = "eliminate_join_marks-860" > < a href = "#eliminate_join_marks-860" > < span class = "linenos" > 860< / span > < / a > < span class = "sd" > A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-861" > < a href = "#eliminate_join_marks-861" > < span class = "linenos" > 861< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-862" > < a href = "#eliminate_join_marks-862" > < span class = "linenos" > 862< / span > < / a > < span class = "sd" > A WHERE condition cannot compare any column marked with the (+) operator with a subquery.< / span >
< / span > < span id = "eliminate_join_marks-863" > < a href = "#eliminate_join_marks-863" > < span class = "linenos" > 863< / span > < / a >
< / span > < span id = "eliminate_join_marks-864" > < a href = "#eliminate_join_marks-864" > < span class = "linenos" > 864< / span > < / a > < span class = "sd" > -- example with WHERE< / span >
< / span > < span id = "eliminate_join_marks-865" > < a href = "#eliminate_join_marks-865" > < span class = "linenos" > 865< / span > < / a > < span class = "sd" > SELECT d.department_name, sum(e.salary) as total_salary< / span >
< / span > < span id = "eliminate_join_marks-866" > < a href = "#eliminate_join_marks-866" > < span class = "linenos" > 866< / span > < / a > < span class = "sd" > FROM departments d, employees e< / span >
< / span > < span id = "eliminate_join_marks-867" > < a href = "#eliminate_join_marks-867" > < span class = "linenos" > 867< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id< / span >
< / span > < span id = "eliminate_join_marks-868" > < a href = "#eliminate_join_marks-868" > < span class = "linenos" > 868< / span > < / a > < span class = "sd" > group by department_name< / span >
< / span > < span id = "eliminate_join_marks-869" > < a href = "#eliminate_join_marks-869" > < span class = "linenos" > 869< / span > < / a >
< / span > < span id = "eliminate_join_marks-870" > < a href = "#eliminate_join_marks-870" > < span class = "linenos" > 870< / span > < / a > < span class = "sd" > -- example of left correlation in select< / span >
< / span > < span id = "eliminate_join_marks-871" > < a href = "#eliminate_join_marks-871" > < span class = "linenos" > 871< / span > < / a > < span class = "sd" > SELECT d.department_name, (< / span >
< / span > < span id = "eliminate_join_marks-872" > < a href = "#eliminate_join_marks-872" > < span class = "linenos" > 872< / span > < / a > < span class = "sd" > SELECT SUM(e.salary)< / span >
< / span > < span id = "eliminate_join_marks-873" > < a href = "#eliminate_join_marks-873" > < span class = "linenos" > 873< / span > < / a > < span class = "sd" > FROM employees e< / span >
< / span > < span id = "eliminate_join_marks-874" > < a href = "#eliminate_join_marks-874" > < span class = "linenos" > 874< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id) AS total_salary< / span >
< / span > < span id = "eliminate_join_marks-875" > < a href = "#eliminate_join_marks-875" > < span class = "linenos" > 875< / span > < / a > < span class = "sd" > FROM departments d;< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-876" > < a href = "#eliminate_join_marks-876" > < span class = "linenos" > 876< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-877" > < a href = "#eliminate_join_marks-877" > < span class = "linenos" > 877< / span > < / a > < span class = "sd" > -- example of left correlation in from< / span >
< / span > < span id = "eliminate_join_marks-878" > < a href = "#eliminate_join_marks-878" > < span class = "linenos" > 878< / span > < / a > < span class = "sd" > SELECT d.department_name, t.total_salary< / span >
< / span > < span id = "eliminate_join_marks-879" > < a href = "#eliminate_join_marks-879" > < span class = "linenos" > 879< / span > < / a > < span class = "sd" > FROM departments d, (< / span >
< / span > < span id = "eliminate_join_marks-880" > < a href = "#eliminate_join_marks-880" > < span class = "linenos" > 880< / span > < / a > < span class = "sd" > SELECT SUM(e.salary) AS total_salary< / span >
< / span > < span id = "eliminate_join_marks-881" > < a href = "#eliminate_join_marks-881" > < span class = "linenos" > 881< / span > < / a > < span class = "sd" > FROM employees e< / span >
< / span > < span id = "eliminate_join_marks-882" > < a href = "#eliminate_join_marks-882" > < span class = "linenos" > 882< / span > < / a > < span class = "sd" > WHERE e.department_id(+) = d.department_id< / span >
< / span > < span id = "eliminate_join_marks-883" > < a href = "#eliminate_join_marks-883" > < span class = "linenos" > 883< / span > < / a > < span class = "sd" > ) t< / span >
< / span > < span id = "eliminate_join_marks-884" > < a href = "#eliminate_join_marks-884" > < span class = "linenos" > 884< / span > < / a > < span class = "sd" > " " " < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-885" > < a href = "#eliminate_join_marks-885" > < span class = "linenos" > 885< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-886" > < a href = "#eliminate_join_marks-886" > < span class = "linenos" > 886< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > traverse_scope< / span >
< / span > < span id = "eliminate_join_marks-887" > < a href = "#eliminate_join_marks-887" > < span class = "linenos" > 887< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.normalize< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > normalize< / span > < span class = "p" > ,< / span > < span class = "n" > normalized< / span >
< / span > < span id = "eliminate_join_marks-888" > < a href = "#eliminate_join_marks-888" > < span class = "linenos" > 888< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > collections< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > defaultdict< / span >
< / span > < span id = "eliminate_join_marks-889" > < a href = "#eliminate_join_marks-889" > < span class = "linenos" > 889< / span > < / a >
< / span > < span id = "eliminate_join_marks-890" > < a href = "#eliminate_join_marks-890" > < span class = "linenos" > 890< / span > < / a > < span class = "c1" > # we go in reverse to check the main query for left correlation< / span >
< / span > < span id = "eliminate_join_marks-891" > < a href = "#eliminate_join_marks-891" > < span class = "linenos" > 891< / span > < / a > < span class = "k" > for< / span > < span class = "n" > scope< / span > < span class = "ow" > in< / span > < span class = "nb" > reversed< / span > < span class = "p" > (< / span > < span class = "n" > traverse_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )):< / span >
< / span > < span id = "eliminate_join_marks-892" > < a href = "#eliminate_join_marks-892" > < span class = "linenos" > 892< / span > < / a > < span class = "n" > query< / span > < span class = "o" > =< / span > < span class = "n" > scope< / span > < span class = "o" > .< / span > < span class = "n" > expression< / span >
< / span > < span id = "eliminate_join_marks-893" > < a href = "#eliminate_join_marks-893" > < span class = "linenos" > 893< / span > < / a >
< / span > < span id = "eliminate_join_marks-894" > < a href = "#eliminate_join_marks-894" > < span class = "linenos" > 894< / span > < / a > < span class = "n" > where< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " where" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-895" > < a href = "#eliminate_join_marks-895" > < span class = "linenos" > 895< / span > < / a > < span class = "n" > joins< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ,< / span > < span class = "p" > [])< / span >
< / span > < span id = "eliminate_join_marks-896" > < a href = "#eliminate_join_marks-896" > < span class = "linenos" > 896< / span > < / a >
< / span > < span id = "eliminate_join_marks-897" > < a href = "#eliminate_join_marks-897" > < span class = "linenos" > 897< / span > < / a > < span class = "c1" > # knockout: we do not support left correlation (see point 2)< / span >
< / span > < span id = "eliminate_join_marks-898" > < a href = "#eliminate_join_marks-898" > < span class = "linenos" > 898< / span > < / a > < span class = "k" > assert< / span > < span class = "ow" > not< / span > < span class = "n" > scope< / span > < span class = "o" > .< / span > < span class = "n" > is_correlated_subquery< / span > < span class = "p" > ,< / span > < span class = "s2" > " Correlated queries are not supported" < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-899" > < a href = "#eliminate_join_marks-899" > < span class = "linenos" > 899< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-900" > < a href = "#eliminate_join_marks-900" > < span class = "linenos" > 900< / span > < / a > < span class = "c1" > # nothing to do - we check it here after knockout above< / span >
< / span > < span id = "eliminate_join_marks-901" > < a href = "#eliminate_join_marks-901" > < span class = "linenos" > 901< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > where< / span > < span class = "ow" > or< / span > < span class = "ow" > not< / span > < span class = "nb" > any< / span > < span class = "p" > (< / span > < span class = "n" > c< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > c< / span > < span class = "ow" > in< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )):< / span >
< / span > < span id = "eliminate_join_marks-902" > < a href = "#eliminate_join_marks-902" > < span class = "linenos" > 902< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "eliminate_join_marks-903" > < a href = "#eliminate_join_marks-903" > < span class = "linenos" > 903< / span > < / a >
< / span > < span id = "eliminate_join_marks-904" > < a href = "#eliminate_join_marks-904" > < span class = "linenos" > 904< / span > < / a > < span class = "c1" > # make sure we have AND of ORs to have clear join terms< / span >
< / span > < span id = "eliminate_join_marks-905" > < a href = "#eliminate_join_marks-905" > < span class = "linenos" > 905< / span > < / a > < span class = "n" > where< / span > < span class = "o" > =< / span > < span class = "n" > normalize< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-906" > < a href = "#eliminate_join_marks-906" > < span class = "linenos" > 906< / span > < / a > < span class = "k" > assert< / span > < span class = "n" > normalized< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "p" > ),< / span > < span class = "s2" > " Cannot normalize JOIN predicates" < / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-907" > < a href = "#eliminate_join_marks-907" > < span class = "linenos" > 907< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-908" > < a href = "#eliminate_join_marks-908" > < span class = "linenos" > 908< / span > < / a > < span class = "n" > joins_ons< / span > < span class = "o" > =< / span > < span class = "n" > defaultdict< / span > < span class = "p" > (< / span > < span class = "nb" > list< / span > < span class = "p" > )< / span > < span class = "c1" > # dict of {name: list of join AND conditions}< / span >
< / span > < span id = "eliminate_join_marks-909" > < a href = "#eliminate_join_marks-909" > < span class = "linenos" > 909< / span > < / a > < span class = "k" > for< / span > < span class = "n" > cond< / span > < span class = "ow" > in< / span > < span class = "p" > [< / span > < span class = "n" > where< / span > < span class = "p" > ]< / span > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > where< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > And< / span > < span class = "p" > )< / span > < span class = "k" > else< / span > < span class = "n" > where< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ():< / span >
< / span > < span id = "eliminate_join_marks-910" > < a href = "#eliminate_join_marks-910" > < span class = "linenos" > 910< / span > < / a > < span class = "n" > join_cols< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > col< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > cond< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > )]< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-911" > < a href = "#eliminate_join_marks-911" > < span class = "linenos" > 911< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-912" > < a href = "#eliminate_join_marks-912" > < span class = "linenos" > 912< / span > < / a > < span class = "n" > left_join_table< / span > < span class = "o" > =< / span > < span class = "nb" > set< / span > < span class = "p" > (< / span > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > table< / span > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > join_cols< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-913" > < a href = "#eliminate_join_marks-913" > < span class = "linenos" > 913< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > left_join_table< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-914" > < a href = "#eliminate_join_marks-914" > < span class = "linenos" > 914< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "eliminate_join_marks-915" > < a href = "#eliminate_join_marks-915" > < span class = "linenos" > 915< / span > < / a >
< / span > < span id = "eliminate_join_marks-916" > < a href = "#eliminate_join_marks-916" > < span class = "linenos" > 916< / span > < / a > < span class = "k" > assert< / span > < span class = "ow" > not< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_join_marks-917" > < a href = "#eliminate_join_marks-917" > < span class = "linenos" > 917< / span > < / a > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > left_join_table< / span > < span class = "p" > )< / span > < span class = "o" > > < / span > < span class = "mi" > 1< / span >
< / span > < span id = "eliminate_join_marks-918" > < a href = "#eliminate_join_marks-918" > < span class = "linenos" > 918< / span > < / a > < span class = "p" > ),< / span > < span class = "s2" > " Cannot combine JOIN predicates from different tables" < / span >
< / span > < span id = "eliminate_join_marks-919" > < a href = "#eliminate_join_marks-919" > < span class = "linenos" > 919< / span > < / a >
< / span > < span id = "eliminate_join_marks-920" > < a href = "#eliminate_join_marks-920" > < span class = "linenos" > 920< / span > < / a > < span class = "k" > for< / span > < span class = "n" > col< / span > < span class = "ow" > in< / span > < span class = "n" > join_cols< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-921" > < a href = "#eliminate_join_marks-921" > < span class = "linenos" > 921< / span > < / a > < span class = "n" > col< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " join_mark" < / span > < span class = "p" > ,< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-922" > < a href = "#eliminate_join_marks-922" > < span class = "linenos" > 922< / span > < / a >
< / span > < span id = "eliminate_join_marks-923" > < a href = "#eliminate_join_marks-923" > < span class = "linenos" > 923< / span > < / a > < span class = "n" > joins_ons< / span > < span class = "p" > [< / span > < span class = "n" > left_join_table< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()]< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > cond< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-924" > < a href = "#eliminate_join_marks-924" > < span class = "linenos" > 924< / span > < / a >
< / span > < span id = "eliminate_join_marks-925" > < a href = "#eliminate_join_marks-925" > < span class = "linenos" > 925< / span > < / a > < span class = "n" > old_joins< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > join< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > :< / span > < span class = "n" > join< / span > < span class = "k" > for< / span > < span class = "n" > join< / span > < span class = "ow" > in< / span > < span class = "n" > joins< / span > < span class = "p" > }< / span >
< / span > < span id = "eliminate_join_marks-926" > < a href = "#eliminate_join_marks-926" > < span class = "linenos" > 926< / span > < / a > < span class = "n" > new_joins< / span > < span class = "o" > =< / span > < span class = "p" > {}< / span >
< / span > < span id = "eliminate_join_marks-927" > < a href = "#eliminate_join_marks-927" > < span class = "linenos" > 927< / span > < / a > < span class = "n" > query_from< / span > < span class = "o" > =< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "eliminate_join_marks-928" > < a href = "#eliminate_join_marks-928" > < span class = "linenos" > 928< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "eliminate_join_marks-929" > < a href = "#eliminate_join_marks-929" > < span class = "linenos" > 929< / span > < / a > < span class = "k" > for< / span > < span class = "n" > table< / span > < span class = "p" > ,< / span > < span class = "n" > predicates< / span > < span class = "ow" > in< / span > < span class = "n" > joins_ons< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ():< / span >
< / span > < span id = "eliminate_join_marks-930" > < a href = "#eliminate_join_marks-930" > < span class = "linenos" > 930< / span > < / a > < span class = "n" > join_what< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > table< / span > < span class = "p" > ,< / span > < span class = "n" > query_from< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_join_marks-931" > < a href = "#eliminate_join_marks-931" > < span class = "linenos" > 931< / span > < / a > < span class = "n" > new_joins< / span > < span class = "p" > [< / span > < span class = "n" > join_what< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Join< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_join_marks-932" > < a href = "#eliminate_join_marks-932" > < span class = "linenos" > 932< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > join_what< / span > < span class = "p" > ,< / span > < span class = "n" > on< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > and_< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > predicates< / span > < span class = "p" > ),< / span > < span class = "n" > kind< / span > < span class = "o" > =< / span > < span class = "s2" > " LEFT" < / span >
< / span > < span id = "eliminate_join_marks-933" > < a href = "#eliminate_join_marks-933" > < span class = "linenos" > 933< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-934" > < a href = "#eliminate_join_marks-934" > < span class = "linenos" > 934< / span > < / a >
< / span > < span id = "eliminate_join_marks-935" > < a href = "#eliminate_join_marks-935" > < span class = "linenos" > 935< / span > < / a > < span class = "k" > for< / span > < span class = "n" > p< / span > < span class = "ow" > in< / span > < span class = "n" > predicates< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-936" > < a href = "#eliminate_join_marks-936" > < span class = "linenos" > 936< / span > < / a > < span class = "k" > while< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Paren< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_join_marks-937" > < a href = "#eliminate_join_marks-937" > < span class = "linenos" > 937< / span > < / a > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > p< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-938" > < a href = "#eliminate_join_marks-938" > < span class = "linenos" > 938< / span > < / a >
< / span > < span id = "eliminate_join_marks-939" > < a href = "#eliminate_join_marks-939" > < span class = "linenos" > 939< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > =< / span > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span >
< / span > < span id = "eliminate_join_marks-940" > < a href = "#eliminate_join_marks-940" > < span class = "linenos" > 940< / span > < / a > < span class = "n" > p< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_join_marks-941" > < a href = "#eliminate_join_marks-941" > < span class = "linenos" > 941< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Binary< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_join_marks-942" > < a href = "#eliminate_join_marks-942" > < span class = "linenos" > 942< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > right< / span > < span class = "k" > if< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > left< / span > < span class = "ow" > is< / span > < span class = "kc" > None< / span > < span class = "k" > else< / span > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > left< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-943" > < a href = "#eliminate_join_marks-943" > < span class = "linenos" > 943< / span > < / a > < span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > parent< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Where< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_join_marks-944" > < a href = "#eliminate_join_marks-944" > < span class = "linenos" > 944< / span > < / a > < span class = "n" > parent< / span > < span class = "o" > .< / span > < span class = "n" > pop< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_join_marks-945" > < a href = "#eliminate_join_marks-945" > < span class = "linenos" > 945< / span > < / a >
< / span > < span id = "eliminate_join_marks-946" > < a href = "#eliminate_join_marks-946" > < span class = "linenos" > 946< / span > < / a > < span class = "k" > if< / span > < span class = "n" > query_from< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < span class = "ow" > in< / span > < span class = "n" > new_joins< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-947" > < a href = "#eliminate_join_marks-947" > < span class = "linenos" > 947< / span > < / a > < span class = "n" > only_old_joins< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span > < span class = "o" > -< / span > < span class = "n" > new_joins< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span >
< / span > < span id = "eliminate_join_marks-948" > < a href = "#eliminate_join_marks-948" > < span class = "linenos" > 948< / span > < / a > < span class = "k" > assert< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_join_marks-949" > < a href = "#eliminate_join_marks-949" > < span class = "linenos" > 949< / span > < / a > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > only_old_joins< / span > < span class = "p" > )< / span > < span class = "o" > > =< / span > < span class = "mi" > 1< / span >
< / span > < span id = "eliminate_join_marks-950" > < a href = "#eliminate_join_marks-950" > < span class = "linenos" > 950< / span > < / a > < span class = "p" > ),< / span > < span class = "s2" > " Cannot determine which table to use in the new FROM clause" < / span >
< / span > < span id = "eliminate_join_marks-951" > < a href = "#eliminate_join_marks-951" > < span class = "linenos" > 951< / span > < / a >
< / span > < span id = "eliminate_join_marks-952" > < a href = "#eliminate_join_marks-952" > < span class = "linenos" > 952< / span > < / a > < span class = "n" > new_from_name< / span > < span class = "o" > =< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > only_old_joins< / span > < span class = "p" > )[< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< / span > < span id = "eliminate_join_marks-953" > < a href = "#eliminate_join_marks-953" > < span class = "linenos" > 953< / span > < / a > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " from" < / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > From< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > old_joins< / span > < span class = "p" > [< / span > < span class = "n" > new_from_name< / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > this< / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_join_marks-954" > < a href = "#eliminate_join_marks-954" > < span class = "linenos" > 954< / span > < / a >
< / span > < span id = "eliminate_join_marks-955" > < a href = "#eliminate_join_marks-955" > < span class = "linenos" > 955< / span > < / a > < span class = "k" > if< / span > < span class = "n" > new_joins< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-956" > < a href = "#eliminate_join_marks-956" > < span class = "linenos" > 956< / span > < / a > < span class = "k" > for< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > j< / span > < span class = "ow" > in< / span > < span class = "n" > old_joins< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ():< / span > < span class = "c1" > # preserve any other joins< / span >
< / span > < span id = "eliminate_join_marks-957" > < a href = "#eliminate_join_marks-957" > < span class = "linenos" > 957< / span > < / a > < span class = "k" > if< / span > < span class = "n" > n< / span > < span class = "ow" > not< / span > < span class = "ow" > in< / span > < span class = "n" > new_joins< / span > < span class = "ow" > and< / span > < span class = "n" > n< / span > < span class = "o" > !=< / span > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " from" < / span > < span class = "p" > ]< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-958" > < a href = "#eliminate_join_marks-958" > < span class = "linenos" > 958< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > j< / span > < span class = "o" > .< / span > < span class = "n" > kind< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_join_marks-959" > < a href = "#eliminate_join_marks-959" > < span class = "linenos" > 959< / span > < / a > < span class = "n" > j< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " kind" < / span > < span class = "p" > ,< / span > < span class = "s2" > " CROSS" < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_join_marks-960" > < a href = "#eliminate_join_marks-960" > < span class = "linenos" > 960< / span > < / a > < span class = "n" > new_joins< / span > < span class = "p" > [< / span > < span class = "n" > n< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > j< / span >
< / span > < span id = "eliminate_join_marks-961" > < a href = "#eliminate_join_marks-961" > < span class = "linenos" > 961< / span > < / a > < span class = "n" > query< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " joins" < / span > < span class = "p" > ,< / span > < span class = "nb" > list< / span > < span class = "p" > (< / span > < span class = "n" > new_joins< / span > < span class = "o" > .< / span > < span class = "n" > values< / span > < span class = "p" > ()))< / span >
< / span > < span id = "eliminate_join_marks-962" > < a href = "#eliminate_join_marks-962" > < span class = "linenos" > 962< / span > < / a >
< / span > < span id = "eliminate_join_marks-963" > < a href = "#eliminate_join_marks-963" > < span class = "linenos" > 963< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:23:26 +01:00
< / span > < / pre > < / div >
2025-06-15 10:36:04 +02:00
< div class = "docstring" > < p > < a href = "https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178" > https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm#sthref3178< / a > < / p >
2025-02-13 21:41:14 +01:00
2025-06-15 10:36:04 +02:00
< ol >
< li > < p > You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.< / p > < / li >
< li > < p > The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.< / p > < / li >
< / ol >
2025-02-13 15:23:26 +01:00
2025-06-15 10:36:04 +02:00
< p > The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.< / p >
2025-02-13 15:23:26 +01:00
2025-06-15 10:36:04 +02:00
< p > You cannot use the (+) operator to outer-join a table to itself, although self joins are valid.< / p >
2025-02-13 15:23:26 +01:00
2025-06-15 10:36:04 +02:00
< p > The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.< / p >
2025-02-13 15:23:26 +01:00
2025-06-15 10:36:04 +02:00
< p > A WHERE condition containing the (+) operator cannot be combined with another condition using the OR logical operator.< / p >
< p > A WHERE condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.< / p >
< p > A WHERE condition cannot compare any column marked with the (+) operator with a subquery.< / p >
< p > -- example with WHERE
SELECT d.department_name, sum(e.salary) as total_salary
FROM departments d, employees e
WHERE e.department_id(+) = d.department_id
group by department_name< / p >
< p > -- example of left correlation in select
SELECT d.department_name, (
SELECT SUM(e.salary)
FROM employees e
WHERE e.department_id(+) = d.department_id) AS total_salary
FROM departments d;< / p >
< p > -- example of left correlation in from
SELECT d.department_name, t.total_salary
FROM departments d, (
SELECT SUM(e.salary) AS total_salary
FROM employees e
WHERE e.department_id(+) = d.department_id
) t< / p >
2025-02-13 15:23:26 +01:00
< / div >
2025-02-13 21:56:38 +01:00
< / section >
< section id = "any_to_exists" >
< input id = "any_to_exists-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > any_to_exists< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "any_to_exists-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#any_to_exists" > < / a >
2025-06-15 10:36:04 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "any_to_exists-966" > < a href = "#any_to_exists-966" > < span class = "linenos" > 966< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > any_to_exists< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "any_to_exists-967" > < a href = "#any_to_exists-967" > < span class = "linenos" > 967< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "any_to_exists-968" > < a href = "#any_to_exists-968" > < span class = "linenos" > 968< / span > < / a > < span class = "sd" > Transform ANY operator to Spark' s EXISTS< / span >
< / span > < span id = "any_to_exists-969" > < a href = "#any_to_exists-969" > < span class = "linenos" > 969< / span > < / a >
< / span > < span id = "any_to_exists-970" > < a href = "#any_to_exists-970" > < span class = "linenos" > 970< / span > < / a > < span class = "sd" > For example,< / span >
< / span > < span id = "any_to_exists-971" > < a href = "#any_to_exists-971" > < span class = "linenos" > 971< / span > < / a > < span class = "sd" > - Postgres: SELECT * FROM tbl WHERE 5 > ANY(tbl.col)< / span >
< / span > < span id = "any_to_exists-972" > < a href = "#any_to_exists-972" > < span class = "linenos" > 972< / span > < / a > < span class = "sd" > - Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -> x < 5)< / span >
2025-05-24 07:15:28 +02:00
< / span > < span id = "any_to_exists-973" > < a href = "#any_to_exists-973" > < span class = "linenos" > 973< / span > < / a >
2025-06-15 10:36:04 +02:00
< / span > < span id = "any_to_exists-974" > < a href = "#any_to_exists-974" > < span class = "linenos" > 974< / span > < / a > < span class = "sd" > Both ANY and EXISTS accept queries but currently only array expressions are supported for this< / span >
< / span > < span id = "any_to_exists-975" > < a href = "#any_to_exists-975" > < span class = "linenos" > 975< / span > < / a > < span class = "sd" > transformation< / span >
< / span > < span id = "any_to_exists-976" > < a href = "#any_to_exists-976" > < span class = "linenos" > 976< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "any_to_exists-977" > < a href = "#any_to_exists-977" > < span class = "linenos" > 977< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > ):< / span >
< / span > < span id = "any_to_exists-978" > < a href = "#any_to_exists-978" > < span class = "linenos" > 978< / span > < / a > < span class = "k" > for< / span > < span class = "n" > any_expr< / span > < span class = "ow" > in< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > find_all< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Any< / span > < span class = "p" > ):< / span >
< / span > < span id = "any_to_exists-979" > < a href = "#any_to_exists-979" > < span class = "linenos" > 979< / span > < / a > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > this< / span >
< / span > < span id = "any_to_exists-980" > < a href = "#any_to_exists-980" > < span class = "linenos" > 980< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Query< / span > < span class = "p" > ):< / span >
< / span > < span id = "any_to_exists-981" > < a href = "#any_to_exists-981" > < span class = "linenos" > 981< / span > < / a > < span class = "k" > continue< / span >
< / span > < span id = "any_to_exists-982" > < a href = "#any_to_exists-982" > < span class = "linenos" > 982< / span > < / a >
< / span > < span id = "any_to_exists-983" > < a href = "#any_to_exists-983" > < span class = "linenos" > 983< / span > < / a > < span class = "n" > binop< / span > < span class = "o" > =< / span > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > parent< / span >
< / span > < span id = "any_to_exists-984" > < a href = "#any_to_exists-984" > < span class = "linenos" > 984< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > binop< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Binary< / span > < span class = "p" > ):< / span >
< / span > < span id = "any_to_exists-985" > < a href = "#any_to_exists-985" > < span class = "linenos" > 985< / span > < / a > < span class = "n" > lambda_arg< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > to_identifier< / span > < span class = "p" > (< / span > < span class = "s2" > " x" < / span > < span class = "p" > )< / span >
< / span > < span id = "any_to_exists-986" > < a href = "#any_to_exists-986" > < span class = "linenos" > 986< / span > < / a > < span class = "n" > any_expr< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > lambda_arg< / span > < span class = "p" > )< / span >
< / span > < span id = "any_to_exists-987" > < a href = "#any_to_exists-987" > < span class = "linenos" > 987< / span > < / a > < span class = "n" > lambda_expr< / span > < span class = "o" > =< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Lambda< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > binop< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > expressions< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > lambda_arg< / span > < span class = "p" > ])< / span >
< / span > < span id = "any_to_exists-988" > < a href = "#any_to_exists-988" > < span class = "linenos" > 988< / span > < / a > < span class = "n" > binop< / span > < span class = "o" > .< / span > < span class = "n" > replace< / span > < span class = "p" > (< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Exists< / span > < span class = "p" > (< / span > < span class = "n" > this< / span > < span class = "o" > =< / span > < span class = "n" > this< / span > < span class = "o" > .< / span > < span class = "n" > unnest< / span > < span class = "p" > (),< / span > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > lambda_expr< / span > < span class = "p" > ))< / span >
< / span > < span id = "any_to_exists-989" > < a href = "#any_to_exists-989" > < span class = "linenos" > 989< / span > < / a >
< / span > < span id = "any_to_exists-990" > < a href = "#any_to_exists-990" > < span class = "linenos" > 990< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 21:56:38 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Transform ANY operator to Spark's EXISTS< / p >
< p > For example,
- Postgres: SELECT * FROM tbl WHERE 5 > ANY(tbl.col)
- Spark: SELECT * FROM tbl WHERE EXISTS(tbl.col, x -> x < 5)< / p >
< p > Both ANY and EXISTS accept queries but currently only array expressions are supported for this
transformation< / p >
< / div >
2025-05-24 07:15:28 +02:00
< / section >
< section id = "eliminate_window_clause" >
< input id = "eliminate_window_clause-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > eliminate_window_clause< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "eliminate_window_clause-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#eliminate_window_clause" > < / a >
2025-06-15 10:36:04 +02:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_window_clause-993" > < a href = "#eliminate_window_clause-993" > < span class = "linenos" > 993< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > eliminate_window_clause< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_window_clause-994" > < a href = "#eliminate_window_clause-994" > < span class = "linenos" > 994< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " Eliminates the `WINDOW` query clause by inling each named window." " " < / span >
< / span > < span id = "eliminate_window_clause-995" > < a href = "#eliminate_window_clause-995" > < span class = "linenos" > 995< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Select< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_window_clause-996" > < a href = "#eliminate_window_clause-996" > < span class = "linenos" > 996< / span > < / a > < span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > sqlglot.optimizer.scope< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > find_all_in_scope< / span >
< / span > < span id = "eliminate_window_clause-997" > < a href = "#eliminate_window_clause-997" > < span class = "linenos" > 997< / span > < / a >
< / span > < span id = "eliminate_window_clause-998" > < a href = "#eliminate_window_clause-998" > < span class = "linenos" > 998< / span > < / a > < span class = "n" > windows< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > [< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ]< / span >
< / span > < span id = "eliminate_window_clause-999" > < a href = "#eliminate_window_clause-999" > < span class = "linenos" > 999< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " windows" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_window_clause-1000" > < a href = "#eliminate_window_clause-1000" > < span class = "linenos" > 1000< / span > < / a >
< / span > < span id = "eliminate_window_clause-1001" > < a href = "#eliminate_window_clause-1001" > < span class = "linenos" > 1001< / span > < / a > < span class = "n" > window_expression< / span > < span class = "p" > :< / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > Dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "p" > {}< / span >
< / span > < span id = "eliminate_window_clause-1002" > < a href = "#eliminate_window_clause-1002" > < span class = "linenos" > 1002< / span > < / a >
< / span > < span id = "eliminate_window_clause-1003" > < a href = "#eliminate_window_clause-1003" > < span class = "linenos" > 1003< / span > < / a > < span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > :< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Expression< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_window_clause-1004" > < a href = "#eliminate_window_clause-1004" > < span class = "linenos" > 1004< / span > < / a > < span class = "n" > inherited_window< / span > < span class = "o" > =< / span > < span class = "n" > window_expression< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > alias< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ())< / span >
< / span > < span id = "eliminate_window_clause-1005" > < a href = "#eliminate_window_clause-1005" > < span class = "linenos" > 1005< / span > < / a > < span class = "k" > if< / span > < span class = "ow" > not< / span > < span class = "n" > inherited_window< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_window_clause-1006" > < a href = "#eliminate_window_clause-1006" > < span class = "linenos" > 1006< / span > < / a > < span class = "k" > return< / span >
< / span > < span id = "eliminate_window_clause-1007" > < a href = "#eliminate_window_clause-1007" > < span class = "linenos" > 1007< / span > < / a >
< / span > < span id = "eliminate_window_clause-1008" > < a href = "#eliminate_window_clause-1008" > < span class = "linenos" > 1008< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "s2" > " alias" < / span > < span class = "p" > ,< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_window_clause-1009" > < a href = "#eliminate_window_clause-1009" > < span class = "linenos" > 1009< / span > < / a > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "ow" > in< / span > < span class = "p" > (< / span > < span class = "s2" > " partition_by" < / span > < span class = "p" > ,< / span > < span class = "s2" > " order" < / span > < span class = "p" > ,< / span > < span class = "s2" > " spec" < / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_window_clause-1010" > < a href = "#eliminate_window_clause-1010" > < span class = "linenos" > 1010< / span > < / a > < span class = "n" > arg< / span > < span class = "o" > =< / span > < span class = "n" > inherited_window< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "o" > .< / span > < span class = "n" > get< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_window_clause-1011" > < a href = "#eliminate_window_clause-1011" > < span class = "linenos" > 1011< / span > < / a > < span class = "k" > if< / span > < span class = "n" > arg< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_window_clause-1012" > < a href = "#eliminate_window_clause-1012" > < span class = "linenos" > 1012< / span > < / a > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > set< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > arg< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "eliminate_window_clause-1013" > < a href = "#eliminate_window_clause-1013" > < span class = "linenos" > 1013< / span > < / a >
< / span > < span id = "eliminate_window_clause-1014" > < a href = "#eliminate_window_clause-1014" > < span class = "linenos" > 1014< / span > < / a > < span class = "k" > for< / span > < span class = "n" > window< / span > < span class = "ow" > in< / span > < span class = "n" > windows< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_window_clause-1015" > < a href = "#eliminate_window_clause-1015" > < span class = "linenos" > 1015< / span > < / a > < span class = "n" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_window_clause-1016" > < a href = "#eliminate_window_clause-1016" > < span class = "linenos" > 1016< / span > < / a > < span class = "n" > window_expression< / span > < span class = "p" > [< / span > < span class = "n" > window< / span > < span class = "o" > .< / span > < span class = "n" > name< / span > < span class = "o" > .< / span > < span class = "n" > lower< / span > < span class = "p" > ()]< / span > < span class = "o" > =< / span > < span class = "n" > window< / span >
< / span > < span id = "eliminate_window_clause-1017" > < a href = "#eliminate_window_clause-1017" > < span class = "linenos" > 1017< / span > < / a >
< / span > < span id = "eliminate_window_clause-1018" > < a href = "#eliminate_window_clause-1018" > < span class = "linenos" > 1018< / span > < / a > < span class = "k" > for< / span > < span class = "n" > window< / span > < span class = "ow" > in< / span > < span class = "n" > find_all_in_scope< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Window< / span > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_window_clause-1019" > < a href = "#eliminate_window_clause-1019" > < span class = "linenos" > 1019< / span > < / a > < span class = "n" > _inline_inherited_window< / span > < span class = "p" > (< / span > < span class = "n" > window< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_window_clause-1020" > < a href = "#eliminate_window_clause-1020" > < span class = "linenos" > 1020< / span > < / a >
< / span > < span id = "eliminate_window_clause-1021" > < a href = "#eliminate_window_clause-1021" > < span class = "linenos" > 1021< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-05-24 07:15:28 +02:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Eliminates the < code > WINDOW< / code > query clause by inling each named window.< / p >
< / div >
2025-02-13 15:23:26 +01:00
< / 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)
2025-02-13 15:40:23 +01:00
heading += `< span class = "default_value" > = ${doc.default_value}< / span > `;
2025-02-13 15:23:26 +01:00
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 >