2025-02-13 15:22:50 +01:00
<!doctype html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2025-02-13 15:48:55 +01:00
< meta name = "generator" content = "pdoc 13.1.0" / >
2025-02-13 15:22:50 +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 15:31:44 +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 } 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 >
< 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 . 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 : 1 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 . 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 . 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 . 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 . 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 : # 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 5 . 5 2 . 3 5 9 A . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 6 % 2 0 0 h 4 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 . 4 7 4 . 6 5 8 L 8 . 6 9 4 % 2 0 6 H 1 2 . 5 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 % 2 0 . 3 9 5 . 8 0 7 l - 7 % 2 0 9 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 - . 8 7 3 - . 4 5 4 L 6 . 8 2 3 % 2 0 9 . 5 H 3 . 5 a . 5 . 5 % 2 0 0 % 2 0 0 % 2 0 1 - . 4 8 - . 6 4 1 l 2 . 5 - 8 . 5 z % 2 2 / % 3 E % 3 C / s v g % 3 E " ) ; } . p d o c . v i s u a l l y - h i d d e n { p o s i t i o n : a b s o l u t e ! i m p o r t a n t ; w i d t h : 1 p x ! i m p o r t a n t ; h e i g h t : 1 p x ! i m p o r t a n t ; p a d d i n g : 0 ! i m p o r t a n t ; m a r g i n : - 1 p x ! i m p o r t a n t ; o v e r f l o w : h i d d e n ! i m p o r t a n t ; c l i p : r e c t ( 0 , 0 , 0 , 0 ) ! i m p o r t a n t ; w h i t e - s p a c e : n o w r a p ! i m p o r t a n t ; b o r d e r : 0 ! i m p o r t a n t ; } . p d o c h 1 , . p d o c h 2 , . p d o c h 3 { f o n t - w e i g h t : 3 0 0 ; m a r g i n : . 3 e m 0 ; p a d d i n g : . 2 e m 0 ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) h 1 { f o n t - s i z e : 1 . 5 r e m ; f o n t - w e i g h t : 5 0 0 ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) h 2 { f o n t - s i z e : 1 . 4 r e m ; f o n t - w e i g h t : 5 0 0 ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) h 3 { f o n t - s i z e : 1 . 3 r e m ; f o n t - w e i g h t : 5 0 0 ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) h 4 { f o n t - s i z e : 1 . 2 r e m ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) h 5 { f o n t - s i z e : 1 . 1 r e m ; } . p d o c a { t e x t - d e c o r a t i o n : n o n e ; c o l o r : v a r ( - - l i n k ) ; } . p d o c a : h o v e r { c o l o r : v a r ( - - l i n k - h o v e r ) ; } . p d o c b l o c k q u o t e { m a r g i n - l e f t : 2 r e m ; } . p d o c p r e { b o r d e r - t o p : 1 p x s o l i d v a r ( - - a c c e n t 2 ) ; b o r d e r - b o t t o m : 1 p x s o l i d v a r ( - - a c c e n t 2 ) ; m a r g i n - t o p : 0 ; m a r g i n - b o t t o m : 1 e m ; p a d d i n g : . 5 r e m 0 . 5 r e m . 5 r e m ; o v e r f l o w - x : a u t o ; b a c k g r o u n d - c o l o r : v a r ( - - c o d e ) ; } . p d o c c o d e { c o l o r : v a r ( - - t e x t ) ; p a d d i n g : . 2 e m . 4 e m ; m a r g i n : 0 ; f o n t - s i z e : 8 5 % ; b a c k g r o u n d - c o l o r : v a r ( - - c o d e ) ; b o r d e r - r a d i u s : 6 p x ; } . p d o c a > c o d e { c o l o r : i n h e r i t ; } . p d o c p r e > c o d e { d i s p l a y : i n l i n e - b l o c k ; f o n t - s i z e : i n h e r i t ; b a c k g r o u n d : n o n e ; b o r d e r : n o n e ; p a d d i n g : 0 ; } . p d o c > s e c t i o n : n o t ( . m o d u l e - i n f o ) { m a r g i n - b o t t o m : 1 . 5 r e m ; } . p d o c . m o d u l e n a m e { m a r g i n - t o p : 0 ; f o n t - w e i g h t : b o l d ; } . p d o c . m o d u l e n a m e a { c o l o r : v a r ( - - l i n k ) ; t r a n s i t i o n : 1 0 0 m s a l l ; } . p d o c . g i t - b u t t o n { f l o a t : r i g h t ; b o r d e r : s o l i d v a r ( - - l i n k ) 1 p x ; } . p d o c . g i t - b u t t o n : h o v e r { b a c k g r o u n d - c o l o r : v a r ( - - l i n k ) ; c o l o r : v a r ( - - p d o c - b a c k g r o u n d ) ; } . v i e w - s o u r c e - t o g g l e - s t a t e , . v i e w - s o u r c e - t o g g l e - s t a t e ~ . p d o c - c o d e { d i s p l a y : n o n e ; } . v i e w - s o u r c e - t o g g l e - s t a t e : c h e c k e d ~ . p d o c - c o d e { d i s p l a y : b l o c k ; } . v i e w - s o u r c e - b u t t o n { d i s p l a y : i n l i n e - b l o c k ; f l o a t : r i g h t ; f o n t - s i z e : . 7 5 r e m ; l i n e - h e i g h t : 1 . 5 r e m ; c o l o r : v a r ( - - m u t e d ) ; p a d d i n g : 0 . 4 r e m 0 1 . 3 r
2025-02-13 15:22:50 +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:47:04 +01:00
< h2 > API Documentation< / h2 >
< ul class = "memberlist" >
2025-02-13 15:22:50 +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:45:33 +01:00
< li >
< a class = "function" href = "#eliminate_qualify" > eliminate_qualify< / a >
< / li >
2025-02-13 15:22:50 +01:00
< li >
< a class = "function" href = "#remove_precision_parameterized_types" > remove_precision_parameterized_types< / a >
< / li >
< li >
< a class = "function" href = "#preprocess" > preprocess< / a >
< / li >
< li >
< a class = "function" href = "#delegate" > delegate< / a >
< / li >
< / ul >
< footer > Copyright (c) 2023 Toby Mao< / footer >
< a class = "attribution" title = "pdoc: Python API documentation generator" href = "https://pdoc.dev" target = "_blank" >
built with < span class = "visually-hidden" > pdoc< / span > < img
alt="pdoc logo"
src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612
< / a >
< / div >
< / nav >
< main class = "pdoc" >
< section class = "module-info" >
< a class = "pdoc-button git-button" href = "https://github.com/tobymao/sqlglot/tree/main/sqlglot/transforms.py" > Edit on GitHub< / a >
< h1 class = "modulename" >
< a href = "./../sqlglot.html" > sqlglot< / a > < wbr > .transforms < / h1 >
< input id = "mod-transforms-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< label class = "view-source-button" for = "mod-transforms-view-source" > < span > View Source< / span > < / label >
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "L-1" > < a href = "#L-1" > < span class = "linenos" > 1< / span > < / a > < span class = "kn" > from< / span > < span class = "nn" > __future__< / 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 = "nn" > typing< / span > < span class = "k" > as< / span > < span class = "nn" > t< / span >
< / span > < span id = "L-4" > < a href = "#L-4" > < span class = "linenos" > 4< / span > < / a >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-5" > < a href = "#L-5" > < span class = "linenos" > 5< / span > < / a > < span class = "kn" > from< / span > < span class = "nn" > sqlglot< / span > < span class = "kn" > import< / span > < span class = "n" > expressions< / span > < span class = "k" > as< / span > < span class = "n" > exp< / span >
< / span > < span id = "L-6" > < a href = "#L-6" > < span class = "linenos" > 6< / span > < / a > < span class = "kn" > from< / span > < span class = "nn" > sqlglot.helper< / span > < span class = "kn" > import< / span > < span class = "n" > find_new_name< / span >
< / span > < span id = "L-7" > < a href = "#L-7" > < span class = "linenos" > 7< / span > < / a >
< / span > < span id = "L-8" > < a href = "#L-8" > < span class = "linenos" > 8< / 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-9" > < a href = "#L-9" > < span class = "linenos" > 9< / span > < / a > < span class = "kn" > from< / span > < span class = "nn" > sqlglot.generator< / span > < span class = "kn" > import< / span > < span class = "n" > Generator< / span >
< / span > < span id = "L-10" > < a href = "#L-10" > < span class = "linenos" > 10< / span > < / a >
2025-02-13 15:22:50 +01:00
< / span > < span id = "L-11" > < a href = "#L-11" > < span class = "linenos" > 11< / span > < / a >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-12" > < a href = "#L-12" > < span class = "linenos" > 12< / span > < / a > < span class = "k" > def< / 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-13" > < a href = "#L-13" > < span class = "linenos" > 13< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-14" > < a href = "#L-14" > < span class = "linenos" > 14< / span > < / a > < span class = "sd" > Replace references to select aliases in GROUP BY clauses.< / span >
< / span > < span id = "L-15" > < a href = "#L-15" > < span class = "linenos" > 15< / span > < / a >
< / span > < span id = "L-16" > < a href = "#L-16" > < span class = "linenos" > 16< / span > < / a > < span class = "sd" > Example:< / span >
< / span > < span id = "L-17" > < a href = "#L-17" > < span class = "linenos" > 17< / span > < / a > < span class = "sd" > > > > import sqlglot< / span >
< / span > < span id = "L-18" > < a href = "#L-18" > < span class = "linenos" > 18< / 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-19" > < a href = "#L-19" > < span class = "linenos" > 19< / span > < / a > < span class = "sd" > ' SELECT a AS b FROM x GROUP BY 1' < / span >
< / span > < span id = "L-20" > < a href = "#L-20" > < span class = "linenos" > 20< / span > < / a >
< / span > < span id = "L-21" > < a href = "#L-21" > < span class = "linenos" > 21< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-22" > < a href = "#L-22" > < span class = "linenos" > 22< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "L-23" > < a href = "#L-23" > < span class = "linenos" > 23< / span > < / a >
< / span > < span id = "L-24" > < a href = "#L-24" > < span class = "linenos" > 24< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-25" > < a href = "#L-25" > < span class = "linenos" > 25< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "L-26" > < a href = "#L-26" > < span class = "linenos" > 26< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-27" > < a href = "#L-27" > < span class = "linenos" > 27< / 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-28" > < a href = "#L-28" > < span class = "linenos" > 28< / span > < / a > < span class = "n" > aliased_selects< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "L-29" > < a href = "#L-29" > < span class = "linenos" > 29< / 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-30" > < a href = "#L-30" > < span class = "linenos" > 30< / 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-31" > < a href = "#L-31" > < span class = "linenos" > 31< / 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-32" > < a href = "#L-32" > < span class = "linenos" > 32< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "L-33" > < a href = "#L-33" > < span class = "linenos" > 33< / span > < / a >
< / span > < span id = "L-34" > < a href = "#L-34" > < span class = "linenos" > 34< / span > < / a > < span class = "k" > 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-35" > < a href = "#L-35" > < span class = "linenos" > 35< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-36" > < a href = "#L-36" > < span class = "linenos" > 36< / 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-37" > < a href = "#L-37" > < span class = "linenos" > 37< / 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-38" > < a href = "#L-38" > < span class = "linenos" > 38< / 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-39" > < a href = "#L-39" > < span class = "linenos" > 39< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-40" > < a href = "#L-40" > < span class = "linenos" > 40< / span > < / a > < span 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-41" > < a href = "#L-41" > < span class = "linenos" > 41< / span > < / a >
< / span > < span id = "L-42" > < a href = "#L-42" > < span class = "linenos" > 42< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-43" > < a href = "#L-43" > < span class = "linenos" > 43< / span > < / a >
2025-02-13 15:22:50 +01:00
< / span > < span id = "L-44" > < a href = "#L-44" > < span class = "linenos" > 44< / span > < / a >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-45" > < a href = "#L-45" > < span class = "linenos" > 45< / span > < / a > < span class = "k" > def< / 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-46" > < a href = "#L-46" > < span class = "linenos" > 46< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-47" > < a href = "#L-47" > < span class = "linenos" > 47< / span > < / a > < span class = "sd" > Convert SELECT DISTINCT ON statements to a subquery with a window function.< / span >
< / span > < span id = "L-48" > < a href = "#L-48" > < span class = "linenos" > 48< / span > < / a >
< / span > < span id = "L-49" > < a href = "#L-49" > < span class = "linenos" > 49< / span > < / a > < span class = "sd" > This is useful for dialects that don' t support SELECT DISTINCT ON but support window functions.< / span >
< / span > < span id = "L-50" > < a href = "#L-50" > < span class = "linenos" > 50< / span > < / a >
< / span > < span id = "L-51" > < a href = "#L-51" > < span class = "linenos" > 51< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-52" > < a href = "#L-52" > < span class = "linenos" > 52< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "L-53" > < a href = "#L-53" > < span class = "linenos" > 53< / span > < / a >
< / span > < span id = "L-54" > < a href = "#L-54" > < span class = "linenos" > 54< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-55" > < a href = "#L-55" > < span class = "linenos" > 55< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "L-56" > < a href = "#L-56" > < span class = "linenos" > 56< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-57" > < a href = "#L-57" > < span class = "linenos" > 57< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "L-58" > < a href = "#L-58" > < span class = "linenos" > 58< / 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-59" > < a href = "#L-59" > < span class = "linenos" > 59< / 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-60" > < a href = "#L-60" > < span class = "linenos" > 60< / span > < / a > < span class = "ow" > and< / 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 > < span id = "L-61" > < a href = "#L-61" > < span class = "linenos" > 61< / 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 = "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-62" > < a href = "#L-62" > < span class = "linenos" > 62< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "L-63" > < a href = "#L-63" > < span class = "linenos" > 63< / 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-64" > < a href = "#L-64" > < span class = "linenos" > 64< / span > < / a > < span class = "n" > outer_selects< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span >
< / span > < span id = "L-65" > < a href = "#L-65" > < span class = "linenos" > 65< / span > < / a > < span class = "n" > row_number< / 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-66" > < a href = "#L-66" > < span class = "linenos" > 66< / 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 > < span id = "L-67" > < a href = "#L-67" > < span class = "linenos" > 67< / span > < / a > < 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 > < span id = "L-68" > < a href = "#L-68" > < span class = "linenos" > 68< / span > < / a > < span class = "n" > partition_by< / span > < span class = "o" > =< / span > < span class = "n" > distinct_cols< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-69" > < a href = "#L-69" > < span class = "linenos" > 69< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-70" > < a href = "#L-70" > < span class = "linenos" > 70< / span > < / a > < span class = "n" > 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-71" > < a href = "#L-71" > < span class = "linenos" > 71< / span > < / a > < span class = "k" > if< / span > < span class = "n" > order< / span > < span class = "p" > :< / span >
< / span > < span id = "L-72" > < a href = "#L-72" > < span class = "linenos" > 72< / 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 class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-73" > < a href = "#L-73" > < span class = "linenos" > 73< / 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< / span > < span class = "p" > )< / span >
< / span > < span id = "L-74" > < a href = "#L-74" > < span class = "linenos" > 74< / 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-75" > < a href = "#L-75" > < span class = "linenos" > 75< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > outer_selects< / 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" > subquery< / span > < span class = "p" > ())< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s1" > ' " < / span > < span class = "si" > {< / span > < span class = "n" > row_number< / span > < span class = "si" > }< / span > < span class = "s1" > " = 1' < / span > < span class = "p" > )< / span >
< / span > < span id = "L-76" > < a href = "#L-76" > < span class = "linenos" > 76< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-77" > < a href = "#L-77" > < span class = "linenos" > 77< / span > < / a >
< / span > < span id = "L-78" > < a href = "#L-78" > < span class = "linenos" > 78< / span > < / a >
< / span > < span id = "L-79" > < a href = "#L-79" > < span class = "linenos" > 79< / span > < / a > < span class = "k" > def< / 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-80" > < a href = "#L-80" > < span class = "linenos" > 80< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-81" > < a href = "#L-81" > < span class = "linenos" > 81< / span > < / a > < span class = "sd" > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / span >
< / span > < span id = "L-82" > < a href = "#L-82" > < span class = "linenos" > 82< / span > < / a >
< / span > < span id = "L-83" > < a href = "#L-83" > < span class = "linenos" > 83< / span > < / a > < span class = "sd" > The idea behind this transformation can be seen in Snowflake' s documentation for QUALIFY:< / span >
< / span > < span id = "L-84" > < a href = "#L-84" > < span class = "linenos" > 84< / span > < / a > < span class = "sd" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / span >
< / span > < span id = "L-85" > < a href = "#L-85" > < span class = "linenos" > 85< / span > < / a >
< / span > < span id = "L-86" > < a href = "#L-86" > < span class = "linenos" > 86< / span > < / a > < span class = "sd" > Some dialects don' t support window functions in the WHERE clause, so we need to include them as< / span >
< / span > < span id = "L-87" > < a href = "#L-87" > < span class = "linenos" > 87< / 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-88" > < a href = "#L-88" > < span class = "linenos" > 88< / 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-89" > < a href = "#L-89" > < span class = "linenos" > 89< / span > < / a > < span class = "sd" > otherwise we won' t be able to refer to it in the outer query' s WHERE clause.< / span >
< / span > < span id = "L-90" > < a href = "#L-90" > < span class = "linenos" > 90< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-91" > < a href = "#L-91" > < span class = "linenos" > 91< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > 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-92" > < a href = "#L-92" > < span class = "linenos" > 92< / 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-93" > < a href = "#L-93" > < span class = "linenos" > 93< / 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-94" > < a href = "#L-94" > < span class = "linenos" > 94< / 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-95" > < a href = "#L-95" > < span class = "linenos" > 95< / 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-96" > < a href = "#L-96" > < span class = "linenos" > 96< / 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 = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-97" > < a href = "#L-97" > < span class = "linenos" > 97< / 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-98" > < a href = "#L-98" > < span class = "linenos" > 98< / span > < / a >
< / span > < span id = "L-99" > < a href = "#L-99" > < span class = "linenos" > 99< / span > < / a > < span class = "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 = "p" > [< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < 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-100" > < a href = "#L-100" > < span class = "linenos" > 100< / 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 >
2025-02-13 15:22:50 +01:00
< / span > < span id = "L-101" > < a href = "#L-101" > < span class = "linenos" > 101< / span > < / a >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-102" > < a href = "#L-102" > < span class = "linenos" > 102< / span > < / a > < span class = "k" > for< / span > < span class = "n" > expr< / span > < span class = "ow" > in< / span > < span class = "n" > qualify_filters< / 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" > 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-103" > < a href = "#L-103" > < span class = "linenos" > 103< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expr< / 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-104" > < a href = "#L-104" > < span class = "linenos" > 104< / 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-105" > < a href = "#L-105" > < span class = "linenos" > 105< / 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" > expr< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > alias< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "L-106" > < a href = "#L-106" > < span class = "linenos" > 106< / span > < / a > < span class = "n" > expr< / 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" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "L-107" > < a href = "#L-107" > < span class = "linenos" > 107< / span > < / a > < span class = "k" > elif< / span > < span class = "n" > expr< / 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-108" > < a href = "#L-108" > < span class = "linenos" > 108< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > expr< / 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-109" > < a href = "#L-109" > < span class = "linenos" > 109< / span > < / a >
< / span > < span id = "L-110" > < a href = "#L-110" > < span class = "linenos" > 110< / 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 = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > qualify_filters< / span > < span class = "p" > )< / 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" > return< / span > < span class = "n" > expression< / span >
< / span > < span id = "L-113" > < a href = "#L-113" > < span class = "linenos" > 113< / span > < / a >
2025-02-13 15:22:50 +01:00
< / span > < span id = "L-114" > < a href = "#L-114" > < span class = "linenos" > 114< / span > < / a >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-115" > < a href = "#L-115" > < span class = "linenos" > 115< / span > < / a > < span class = "k" > def< / 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-116" > < a href = "#L-116" > < span class = "linenos" > 116< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
2025-02-13 15:48:55 +01:00
< / span > < span id = "L-117" > < a href = "#L-117" > < span class = "linenos" > 117< / 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-118" > < a href = "#L-118" > < span class = "linenos" > 118< / span > < / a > < span class = "sd" > other expressions. This transforms removes the precision from parameterized types in expressions.< / span >
2025-02-13 15:45:33 +01:00
< / span > < span id = "L-119" > < a href = "#L-119" > < span class = "linenos" > 119< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-120" > < a href = "#L-120" > < span class = "linenos" > 120< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > transform< / span > < span class = "p" > (< / span >
< / span > < span id = "L-121" > < a href = "#L-121" > < span class = "linenos" > 121< / span > < / a > < span class = "k" > lambda< / span > < span class = "n" > node< / 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-122" > < a href = "#L-122" > < span class = "linenos" > 122< / span > < / a > < span class = "o" > **< / span > < span class = "p" > {< / span >
< / span > < span id = "L-123" > < a href = "#L-123" > < span class = "linenos" > 123< / span > < / a > < span class = "o" > **< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-124" > < a href = "#L-124" > < span class = "linenos" > 124< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< / span > < span id = "L-125" > < a href = "#L-125" > < span class = "linenos" > 125< / span > < / a > < span class = "n" > node_expression< / span >
< / span > < span id = "L-126" > < a href = "#L-126" > < span class = "linenos" > 126< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node_expression< / span > < span class = "ow" > in< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "L-127" > < a href = "#L-127" > < span class = "linenos" > 127< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node_expression< / 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-128" > < a href = "#L-128" > < span class = "linenos" > 128< / span > < / a > < span class = "p" > ],< / span >
< / span > < span id = "L-129" > < a href = "#L-129" > < span class = "linenos" > 129< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "L-130" > < a href = "#L-130" > < span class = "linenos" > 130< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-131" > < a href = "#L-131" > < span class = "linenos" > 131< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "p" > )< / span >
< / span > < span id = "L-132" > < a href = "#L-132" > < span class = "linenos" > 132< / span > < / a > < span class = "k" > else< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span >
< / span > < span id = "L-133" > < a href = "#L-133" > < span class = "linenos" > 133< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "L-134" > < a href = "#L-134" > < span class = "linenos" > 134< / span > < / a >
< / span > < span id = "L-135" > < a href = "#L-135" > < span class = "linenos" > 135< / span > < / a >
< / span > < span id = "L-136" > < a href = "#L-136" > < span class = "linenos" > 136< / span > < / a > < span class = "k" > def< / span > < span class = "nf" > preprocess< / span > < span class = "p" > (< / span >
< / span > < span id = "L-137" > < a href = "#L-137" > < span class = "linenos" > 137< / 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-138" > < a href = "#L-138" > < span class = "linenos" > 138< / span > < / a > < span class = "n" > to_sql< / 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" > 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-139" > < a href = "#L-139" > < span class = "linenos" > 139< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > 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-140" > < a href = "#L-140" > < span class = "linenos" > 140< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-141" > < a href = "#L-141" > < span class = "linenos" > 141< / span > < / a > < span class = "sd" > Creates a new transform by chaining a sequence of transformations and converts the resulting< / span >
< / span > < span id = "L-142" > < a href = "#L-142" > < span class = "linenos" > 142< / span > < / a > < span class = "sd" > expression to SQL, using an appropriate `Generator.TRANSFORMS` function.< / span >
< / span > < span id = "L-143" > < a href = "#L-143" > < span class = "linenos" > 143< / span > < / a >
< / span > < span id = "L-144" > < a href = "#L-144" > < span class = "linenos" > 144< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "L-145" > < a href = "#L-145" > < span class = "linenos" > 145< / span > < / a > < span class = "sd" > transforms: sequence of transform functions. These will be called in order.< / span >
< / span > < span id = "L-146" > < a href = "#L-146" > < span class = "linenos" > 146< / span > < / a > < span class = "sd" > to_sql: final transform that converts the resulting expression to a SQL string.< / span >
< / span > < span id = "L-147" > < a href = "#L-147" > < span class = "linenos" > 147< / span > < / a >
< / span > < span id = "L-148" > < a href = "#L-148" > < span class = "linenos" > 148< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "L-149" > < a href = "#L-149" > < span class = "linenos" > 149< / span > < / a > < span class = "sd" > Function that can be used as a generator transform.< / span >
< / span > < span id = "L-150" > < a href = "#L-150" > < span class = "linenos" > 150< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "L-151" > < a href = "#L-151" > < span class = "linenos" > 151< / span > < / a >
< / span > < span id = "L-152" > < a href = "#L-152" > < span class = "linenos" > 152< / span > < / a > < span class = "k" > def< / 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 > < span id = "L-153" > < a href = "#L-153" > < span class = "linenos" > 153< / 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 = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "L-154" > < a href = "#L-154" > < span class = "linenos" > 154< / span > < / a > < span class = "k" > for< / span > < span class = "n" > t< / 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-155" > < a href = "#L-155" > < span class = "linenos" > 155< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > t< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "L-156" > < a href = "#L-156" > < span class = "linenos" > 156< / span > < / a > < span class = "k" > return< / span > < span class = "n" > 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 > < span id = "L-157" > < a href = "#L-157" > < span class = "linenos" > 157< / span > < / a >
< / span > < span id = "L-158" > < a href = "#L-158" > < span class = "linenos" > 158< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _to_sql< / span >
< / span > < span id = "L-159" > < a href = "#L-159" > < span class = "linenos" > 159< / span > < / a >
< / span > < span id = "L-160" > < a href = "#L-160" > < span class = "linenos" > 160< / span > < / a >
< / span > < span id = "L-161" > < a href = "#L-161" > < span class = "linenos" > 161< / span > < / a > < span class = "k" > def< / span > < span class = "nf" > delegate< / span > < span class = "p" > (< / span > < span class = "n" > attr< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < 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 > < span id = "L-162" > < a href = "#L-162" > < span class = "linenos" > 162< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "L-163" > < a href = "#L-163" > < span class = "linenos" > 163< / span > < / a > < span class = "sd" > Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`< / span >
< / span > < span id = "L-164" > < a href = "#L-164" > < span class = "linenos" > 164< / span > < / a > < span class = "sd" > functions that delegate to existing generator methods.< / span >
< / span > < span id = "L-165" > < a href = "#L-165" > < span class = "linenos" > 165< / span > < / a > < span class = "sd" > " " " < / span >
< / 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 = "nf" > _transform< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > ):< / span >
< / span > < span id = "L-168" > < a href = "#L-168" > < span class = "linenos" > 168< / span > < / a > < span class = "k" > return< / span > < span class = "nb" > getattr< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > attr< / span > < span class = "p" > )(< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > )< / span >
< / span > < span id = "L-169" > < a href = "#L-169" > < span class = "linenos" > 169< / span > < / a >
< / span > < span id = "L-170" > < a href = "#L-170" > < span class = "linenos" > 170< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _transform< / span >
< / span > < span id = "L-171" > < a href = "#L-171" > < span class = "linenos" > 171< / span > < / a >
< / span > < span id = "L-172" > < a href = "#L-172" > < span class = "linenos" > 172< / span > < / a >
< / span > < span id = "L-173" > < a href = "#L-173" > < span class = "linenos" > 173< / span > < / a > < span class = "n" > UNALIAS_GROUP< / span > < span class = "o" > =< / 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 = "n" > preprocess< / span > < span class = "p" > ([< / span > < span class = "n" > unalias_group< / span > < span class = "p" > ],< / span > < span class = "n" > delegate< / span > < span class = "p" > (< / span > < span class = "s2" > " group_sql" < / span > < span class = "p" > ))}< / span >
< / span > < span id = "L-174" > < a href = "#L-174" > < span class = "linenos" > 174< / span > < / a > < span class = "n" > ELIMINATE_DISTINCT_ON< / span > < span class = "o" > =< / 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 = "n" > preprocess< / span > < span class = "p" > ([< / span > < span class = "n" > eliminate_distinct_on< / span > < span class = "p" > ],< / span > < span class = "n" > delegate< / span > < span class = "p" > (< / span > < span class = "s2" > " select_sql" < / span > < span class = "p" > ))}< / span >
< / span > < span id = "L-175" > < a href = "#L-175" > < span class = "linenos" > 175< / span > < / a > < span class = "n" > ELIMINATE_QUALIFY< / span > < span class = "o" > =< / 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 = "n" > preprocess< / span > < span class = "p" > ([< / span > < span class = "n" > eliminate_qualify< / span > < span class = "p" > ],< / span > < span class = "n" > delegate< / span > < span class = "p" > (< / span > < span class = "s2" > " select_sql" < / span > < span class = "p" > ))}< / span >
< / span > < span id = "L-176" > < a href = "#L-176" > < span class = "linenos" > 176< / span > < / a > < span class = "n" > REMOVE_PRECISION_PARAMETERIZED_TYPES< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "L-177" > < a href = "#L-177" > < span class = "linenos" > 177< / span > < / a > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Cast< / span > < span class = "p" > :< / span > < span class = "n" > preprocess< / span > < span class = "p" > ([< / span > < span class = "n" > remove_precision_parameterized_types< / span > < span class = "p" > ],< / span > < span class = "n" > delegate< / span > < span class = "p" > (< / span > < span class = "s2" > " cast_sql" < / span > < span class = "p" > ))< / span >
< / span > < span id = "L-178" > < a href = "#L-178" > < span class = "linenos" > 178< / span > < / a > < span class = "p" > }< / span >
2025-02-13 15:22:50 +01:00
< / span > < / pre > < / div >
< / section >
< section id = "unalias_group" >
< input id = "unalias_group-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > unalias_group< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > expression< / span > < span class = "p" > :< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > :< / span > < / span >
< label class = "view-source-button" for = "unalias_group-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#unalias_group" > < / a >
2025-02-13 15:45:33 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "unalias_group-13" > < a href = "#unalias_group-13" > < span class = "linenos" > 13< / span > < / a > < span class = "k" > def< / 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 = "unalias_group-14" > < a href = "#unalias_group-14" > < span class = "linenos" > 14< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "unalias_group-15" > < a href = "#unalias_group-15" > < span class = "linenos" > 15< / span > < / a > < span class = "sd" > Replace references to select aliases in GROUP BY clauses.< / span >
< / span > < span id = "unalias_group-16" > < a href = "#unalias_group-16" > < span class = "linenos" > 16< / span > < / a >
< / span > < span id = "unalias_group-17" > < a href = "#unalias_group-17" > < span class = "linenos" > 17< / span > < / a > < span class = "sd" > Example:< / span >
< / span > < span id = "unalias_group-18" > < a href = "#unalias_group-18" > < span class = "linenos" > 18< / span > < / a > < span class = "sd" > > > > import sqlglot< / span >
< / span > < span id = "unalias_group-19" > < a href = "#unalias_group-19" > < span class = "linenos" > 19< / 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-20" > < a href = "#unalias_group-20" > < span class = "linenos" > 20< / span > < / a > < span class = "sd" > ' SELECT a AS b FROM x GROUP BY 1' < / span >
< / span > < span id = "unalias_group-21" > < a href = "#unalias_group-21" > < span class = "linenos" > 21< / span > < / a >
< / span > < span id = "unalias_group-22" > < a href = "#unalias_group-22" > < span class = "linenos" > 22< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "unalias_group-23" > < a href = "#unalias_group-23" > < span class = "linenos" > 23< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "unalias_group-24" > < a href = "#unalias_group-24" > < span class = "linenos" > 24< / span > < / a >
< / span > < span id = "unalias_group-25" > < a href = "#unalias_group-25" > < span class = "linenos" > 25< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "unalias_group-26" > < a href = "#unalias_group-26" > < span class = "linenos" > 26< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "unalias_group-27" > < a href = "#unalias_group-27" > < span class = "linenos" > 27< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "unalias_group-28" > < a href = "#unalias_group-28" > < span class = "linenos" > 28< / 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-29" > < a href = "#unalias_group-29" > < span class = "linenos" > 29< / span > < / a > < span class = "n" > aliased_selects< / span > < span class = "o" > =< / span > < span class = "p" > {< / span >
< / span > < span id = "unalias_group-30" > < a href = "#unalias_group-30" > < span class = "linenos" > 30< / 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-31" > < a href = "#unalias_group-31" > < span class = "linenos" > 31< / 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-32" > < a href = "#unalias_group-32" > < span class = "linenos" > 32< / 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-33" > < a href = "#unalias_group-33" > < span class = "linenos" > 33< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "unalias_group-34" > < a href = "#unalias_group-34" > < span class = "linenos" > 34< / span > < / a >
< / span > < span id = "unalias_group-35" > < a href = "#unalias_group-35" > < span class = "linenos" > 35< / 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-36" > < a href = "#unalias_group-36" > < span class = "linenos" > 36< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "unalias_group-37" > < a href = "#unalias_group-37" > < span class = "linenos" > 37< / 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-38" > < a href = "#unalias_group-38" > < span class = "linenos" > 38< / 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-39" > < a href = "#unalias_group-39" > < span class = "linenos" > 39< / 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-40" > < a href = "#unalias_group-40" > < span class = "linenos" > 40< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "unalias_group-41" > < a href = "#unalias_group-41" > < span class = "linenos" > 41< / 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-42" > < a href = "#unalias_group-42" > < span class = "linenos" > 42< / span > < / a >
< / span > < span id = "unalias_group-43" > < a href = "#unalias_group-43" > < span class = "linenos" > 43< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:22:50 +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" >
< pre > < span > < / span > < code > < span class = "gp" > > > > < / span > < span class = "kn" > import< / span > < span class = "nn" > sqlglot< / span >
< 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 15:45:33 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_distinct_on-46" > < a href = "#eliminate_distinct_on-46" > < span class = "linenos" > 46< / span > < / a > < span class = "k" > def< / 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 = "eliminate_distinct_on-47" > < a href = "#eliminate_distinct_on-47" > < span class = "linenos" > 47< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_distinct_on-48" > < a href = "#eliminate_distinct_on-48" > < span class = "linenos" > 48< / span > < / a > < span class = "sd" > Convert SELECT DISTINCT ON statements to a subquery with a window function.< / span >
< / span > < span id = "eliminate_distinct_on-49" > < a href = "#eliminate_distinct_on-49" > < span class = "linenos" > 49< / span > < / a >
< / span > < span id = "eliminate_distinct_on-50" > < a href = "#eliminate_distinct_on-50" > < span class = "linenos" > 50< / 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-51" > < a href = "#eliminate_distinct_on-51" > < span class = "linenos" > 51< / span > < / a >
< / span > < span id = "eliminate_distinct_on-52" > < a href = "#eliminate_distinct_on-52" > < span class = "linenos" > 52< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "eliminate_distinct_on-53" > < a href = "#eliminate_distinct_on-53" > < span class = "linenos" > 53< / span > < / a > < span class = "sd" > expression: the expression that will be transformed.< / span >
< / span > < span id = "eliminate_distinct_on-54" > < a href = "#eliminate_distinct_on-54" > < span class = "linenos" > 54< / span > < / a >
< / span > < span id = "eliminate_distinct_on-55" > < a href = "#eliminate_distinct_on-55" > < span class = "linenos" > 55< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "eliminate_distinct_on-56" > < a href = "#eliminate_distinct_on-56" > < span class = "linenos" > 56< / span > < / a > < span class = "sd" > The transformed expression.< / span >
< / span > < span id = "eliminate_distinct_on-57" > < a href = "#eliminate_distinct_on-57" > < span class = "linenos" > 57< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_distinct_on-58" > < a href = "#eliminate_distinct_on-58" > < span class = "linenos" > 58< / span > < / a > < span class = "k" > if< / span > < span class = "p" > (< / span >
< / span > < span id = "eliminate_distinct_on-59" > < a href = "#eliminate_distinct_on-59" > < span class = "linenos" > 59< / 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-60" > < a href = "#eliminate_distinct_on-60" > < span class = "linenos" > 60< / 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 = "eliminate_distinct_on-61" > < a href = "#eliminate_distinct_on-61" > < span class = "linenos" > 61< / span > < / a > < span class = "ow" > and< / 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 > < span id = "eliminate_distinct_on-62" > < a href = "#eliminate_distinct_on-62" > < span class = "linenos" > 62< / 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 = "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-63" > < a href = "#eliminate_distinct_on-63" > < span class = "linenos" > 63< / span > < / a > < span class = "p" > ):< / span >
< / span > < span id = "eliminate_distinct_on-64" > < a href = "#eliminate_distinct_on-64" > < span class = "linenos" > 64< / 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-65" > < a href = "#eliminate_distinct_on-65" > < span class = "linenos" > 65< / span > < / a > < span class = "n" > outer_selects< / span > < span class = "o" > =< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > selects< / span >
< / span > < span id = "eliminate_distinct_on-66" > < a href = "#eliminate_distinct_on-66" > < span class = "linenos" > 66< / span > < / a > < span class = "n" > row_number< / 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-67" > < a href = "#eliminate_distinct_on-67" > < span class = "linenos" > 67< / 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 > < span id = "eliminate_distinct_on-68" > < a href = "#eliminate_distinct_on-68" > < span class = "linenos" > 68< / span > < / a > < 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 > < span id = "eliminate_distinct_on-69" > < a href = "#eliminate_distinct_on-69" > < span class = "linenos" > 69< / span > < / a > < 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-70" > < a href = "#eliminate_distinct_on-70" > < span class = "linenos" > 70< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-71" > < a href = "#eliminate_distinct_on-71" > < span class = "linenos" > 71< / 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 = "eliminate_distinct_on-72" > < a href = "#eliminate_distinct_on-72" > < span class = "linenos" > 72< / span > < / a > < span class = "k" > if< / span > < span class = "n" > order< / span > < span class = "p" > :< / span >
< / span > < span id = "eliminate_distinct_on-73" > < a href = "#eliminate_distinct_on-73" > < span class = "linenos" > 73< / 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 class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "eliminate_distinct_on-74" > < a href = "#eliminate_distinct_on-74" > < span class = "linenos" > 74< / 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< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-75" > < a href = "#eliminate_distinct_on-75" > < span class = "linenos" > 75< / 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-76" > < a href = "#eliminate_distinct_on-76" > < span class = "linenos" > 76< / span > < / a > < span class = "k" > return< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > outer_selects< / 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" > subquery< / span > < span class = "p" > ())< / span > < span class = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s1" > ' " < / span > < span class = "si" > {< / span > < span class = "n" > row_number< / span > < span class = "si" > }< / span > < span class = "s1" > " = 1' < / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_distinct_on-77" > < a href = "#eliminate_distinct_on-77" > < span class = "linenos" > 77< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
2025-02-13 15:22:50 +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:45:33 +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 >
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "eliminate_qualify-80" > < a href = "#eliminate_qualify-80" > < span class = "linenos" > 80< / span > < / a > < span class = "k" > def< / 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 = "eliminate_qualify-81" > < a href = "#eliminate_qualify-81" > < span class = "linenos" > 81< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_qualify-82" > < a href = "#eliminate_qualify-82" > < span class = "linenos" > 82< / span > < / a > < span class = "sd" > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / span >
< / span > < span id = "eliminate_qualify-83" > < a href = "#eliminate_qualify-83" > < span class = "linenos" > 83< / span > < / a >
< / span > < span id = "eliminate_qualify-84" > < a href = "#eliminate_qualify-84" > < span class = "linenos" > 84< / 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-85" > < a href = "#eliminate_qualify-85" > < span class = "linenos" > 85< / span > < / a > < span class = "sd" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / span >
< / span > < span id = "eliminate_qualify-86" > < a href = "#eliminate_qualify-86" > < span class = "linenos" > 86< / span > < / a >
< / span > < span id = "eliminate_qualify-87" > < a href = "#eliminate_qualify-87" > < span class = "linenos" > 87< / 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-88" > < a href = "#eliminate_qualify-88" > < span class = "linenos" > 88< / 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-89" > < a href = "#eliminate_qualify-89" > < span class = "linenos" > 89< / 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-90" > < a href = "#eliminate_qualify-90" > < span class = "linenos" > 90< / span > < / a > < span class = "sd" > otherwise we won' t be able to refer to it in the outer query' s WHERE clause.< / span >
< / span > < span id = "eliminate_qualify-91" > < a href = "#eliminate_qualify-91" > < span class = "linenos" > 91< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "eliminate_qualify-92" > < a href = "#eliminate_qualify-92" > < span class = "linenos" > 92< / 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-93" > < a href = "#eliminate_qualify-93" > < span class = "linenos" > 93< / 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-94" > < a href = "#eliminate_qualify-94" > < span class = "linenos" > 94< / 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-95" > < a href = "#eliminate_qualify-95" > < span class = "linenos" > 95< / 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-96" > < a href = "#eliminate_qualify-96" > < span class = "linenos" > 96< / 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-97" > < a href = "#eliminate_qualify-97" > < span class = "linenos" > 97< / 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 = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_qualify-98" > < a href = "#eliminate_qualify-98" > < span class = "linenos" > 98< / 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-99" > < a href = "#eliminate_qualify-99" > < span class = "linenos" > 99< / span > < / a >
< / span > < span id = "eliminate_qualify-100" > < a href = "#eliminate_qualify-100" > < span class = "linenos" > 100< / 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 = "p" > [< / span > < span class = "n" > select< / span > < span class = "o" > .< / span > < span class = "n" > alias_or_name< / span > < 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-101" > < a href = "#eliminate_qualify-101" > < span class = "linenos" > 101< / 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-102" > < a href = "#eliminate_qualify-102" > < span class = "linenos" > 102< / span > < / a >
< / span > < span id = "eliminate_qualify-103" > < a href = "#eliminate_qualify-103" > < span class = "linenos" > 103< / span > < / a > < span class = "k" > for< / span > < span class = "n" > expr< / span > < span class = "ow" > in< / span > < span class = "n" > qualify_filters< / 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" > Window< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > Column< / span > < span class = "p" > )):< / span >
< / span > < span id = "eliminate_qualify-104" > < a href = "#eliminate_qualify-104" > < span class = "linenos" > 104< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > expr< / 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-105" > < a href = "#eliminate_qualify-105" > < span class = "linenos" > 105< / 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-106" > < a href = "#eliminate_qualify-106" > < span class = "linenos" > 106< / 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" > expr< / span > < span class = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > (),< / span > < span class = "n" > alias< / span > < span class = "p" > ),< / span > < span class = "n" > copy< / span > < span class = "o" > =< / span > < span class = "kc" > False< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-107" > < a href = "#eliminate_qualify-107" > < span class = "linenos" > 107< / span > < / a > < span class = "n" > expr< / 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" > column< / span > < span class = "p" > (< / span > < span class = "n" > alias< / span > < span class = "p" > ))< / span >
< / span > < span id = "eliminate_qualify-108" > < a href = "#eliminate_qualify-108" > < span class = "linenos" > 108< / span > < / a > < span class = "k" > elif< / span > < span class = "n" > expr< / 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-109" > < a href = "#eliminate_qualify-109" > < span class = "linenos" > 109< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > select< / span > < span class = "p" > (< / span > < span class = "n" > expr< / 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-110" > < a href = "#eliminate_qualify-110" > < span class = "linenos" > 110< / span > < / a >
< / span > < span id = "eliminate_qualify-111" > < a href = "#eliminate_qualify-111" > < span class = "linenos" > 111< / 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 = "o" > .< / span > < span class = "n" > where< / span > < span class = "p" > (< / span > < span class = "n" > qualify_filters< / span > < span class = "p" > )< / span >
< / span > < span id = "eliminate_qualify-112" > < a href = "#eliminate_qualify-112" > < span class = "linenos" > 112< / span > < / a >
< / span > < span id = "eliminate_qualify-113" > < a href = "#eliminate_qualify-113" > < span class = "linenos" > 113< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span >
< / span > < / pre > < / div >
< div class = "docstring" > < p > Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.< / p >
< p > The idea behind this transformation can be seen in Snowflake's documentation for QUALIFY:
< a href = "https://docs.snowflake.com/en/sql-reference/constructs/qualify" > https://docs.snowflake.com/en/sql-reference/constructs/qualify< / a > < / p >
< p > Some dialects don't support window functions in the WHERE clause, so we need to include them as
projections in the subquery, in order to refer to them in the outer filter using aliases. Also,
if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,
otherwise we won't be able to refer to it in the outer query's WHERE clause.< / p >
< / div >
2025-02-13 15:22:50 +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 15:45:33 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "remove_precision_parameterized_types-116" > < a href = "#remove_precision_parameterized_types-116" > < span class = "linenos" > 116< / span > < / a > < span class = "k" > def< / 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 = "remove_precision_parameterized_types-117" > < a href = "#remove_precision_parameterized_types-117" > < span class = "linenos" > 117< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
2025-02-13 15:48:55 +01:00
< / span > < span id = "remove_precision_parameterized_types-118" > < a href = "#remove_precision_parameterized_types-118" > < span class = "linenos" > 118< / 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-119" > < a href = "#remove_precision_parameterized_types-119" > < span class = "linenos" > 119< / span > < / a > < span class = "sd" > other expressions. This transforms removes the precision from parameterized types in expressions.< / span >
2025-02-13 15:45:33 +01:00
< / span > < span id = "remove_precision_parameterized_types-120" > < a href = "#remove_precision_parameterized_types-120" > < span class = "linenos" > 120< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "remove_precision_parameterized_types-121" > < a href = "#remove_precision_parameterized_types-121" > < span class = "linenos" > 121< / span > < / a > < span class = "k" > return< / span > < span class = "n" > expression< / span > < span class = "o" > .< / span > < span class = "n" > transform< / span > < span class = "p" > (< / span >
< / span > < span id = "remove_precision_parameterized_types-122" > < a href = "#remove_precision_parameterized_types-122" > < span class = "linenos" > 122< / span > < / a > < span class = "k" > lambda< / span > < span class = "n" > node< / 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-123" > < a href = "#remove_precision_parameterized_types-123" > < span class = "linenos" > 123< / span > < / a > < span class = "o" > **< / span > < span class = "p" > {< / span >
< / span > < span id = "remove_precision_parameterized_types-124" > < a href = "#remove_precision_parameterized_types-124" > < span class = "linenos" > 124< / span > < / a > < span class = "o" > **< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span >
< / span > < span id = "remove_precision_parameterized_types-125" > < a href = "#remove_precision_parameterized_types-125" > < span class = "linenos" > 125< / span > < / a > < span class = "s2" > " expressions" < / span > < span class = "p" > :< / span > < span class = "p" > [< / span >
< / span > < span id = "remove_precision_parameterized_types-126" > < a href = "#remove_precision_parameterized_types-126" > < span class = "linenos" > 126< / span > < / a > < span class = "n" > node_expression< / span >
< / span > < span id = "remove_precision_parameterized_types-127" > < a href = "#remove_precision_parameterized_types-127" > < span class = "linenos" > 127< / span > < / a > < span class = "k" > for< / span > < span class = "n" > node_expression< / span > < span class = "ow" > in< / span > < span class = "n" > node< / span > < span class = "o" > .< / span > < span class = "n" > expressions< / span >
< / span > < span id = "remove_precision_parameterized_types-128" > < a href = "#remove_precision_parameterized_types-128" > < span class = "linenos" > 128< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node_expression< / 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-129" > < a href = "#remove_precision_parameterized_types-129" > < span class = "linenos" > 129< / span > < / a > < span class = "p" > ],< / span >
< / span > < span id = "remove_precision_parameterized_types-130" > < a href = "#remove_precision_parameterized_types-130" > < span class = "linenos" > 130< / span > < / a > < span class = "p" > }< / span >
< / span > < span id = "remove_precision_parameterized_types-131" > < a href = "#remove_precision_parameterized_types-131" > < span class = "linenos" > 131< / span > < / a > < span class = "p" > )< / span >
< / span > < span id = "remove_precision_parameterized_types-132" > < a href = "#remove_precision_parameterized_types-132" > < span class = "linenos" > 132< / span > < / a > < span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span > < span class = "n" > exp< / span > < span class = "o" > .< / span > < span class = "n" > DataType< / span > < span class = "p" > )< / span >
< / span > < span id = "remove_precision_parameterized_types-133" > < a href = "#remove_precision_parameterized_types-133" > < span class = "linenos" > 133< / span > < / a > < span class = "k" > else< / span > < span class = "n" > node< / span > < span class = "p" > ,< / span >
< / span > < span id = "remove_precision_parameterized_types-134" > < a href = "#remove_precision_parameterized_types-134" > < span class = "linenos" > 134< / span > < / a > < span class = "p" > )< / span >
2025-02-13 15:22:50 +01:00
< / span > < / pre > < / div >
2025-02-13 15:48:55 +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:22:50 +01:00
< / div >
< / section >
< section id = "preprocess" >
< input id = "preprocess-view-source" class = "view-source-toggle-state" type = "checkbox" aria-hidden = "true" tabindex = "-1" >
< div class = "attr function" >
< span class = "def" > def< / span >
< span class = "name" > preprocess< / span > < span class = "signature pdoc-code multiline" > (< span class = "param" > < span class = "n" > transforms< / span > < span class = "p" > :< / span > < span class = "n" > List< / span > < span class = "p" > [< / span > < span class = "n" > Callable< / span > < span class = "p" > [[< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ],< / span > < span class = "n" > < a href = "expressions.html#Expression" > sqlglot.expressions.Expression< / a > < / span > < span class = "p" > ]]< / span > ,< / span > < span class = "param" > < span class = "n" > to_sql< / span > < span class = "p" > :< / span > < 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 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 15:45:33 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "preprocess-137" > < a href = "#preprocess-137" > < span class = "linenos" > 137< / span > < / a > < span class = "k" > def< / span > < span class = "nf" > preprocess< / span > < span class = "p" > (< / span >
< / span > < span id = "preprocess-138" > < a href = "#preprocess-138" > < span class = "linenos" > 138< / 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-139" > < a href = "#preprocess-139" > < span class = "linenos" > 139< / span > < / a > < span class = "n" > to_sql< / 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" > 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-140" > < a href = "#preprocess-140" > < span class = "linenos" > 140< / span > < / a > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > t< / span > < span class = "o" > .< / span > < span class = "n" > 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-141" > < a href = "#preprocess-141" > < span class = "linenos" > 141< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "preprocess-142" > < a href = "#preprocess-142" > < span class = "linenos" > 142< / span > < / a > < span class = "sd" > Creates a new transform by chaining a sequence of transformations and converts the resulting< / span >
< / span > < span id = "preprocess-143" > < a href = "#preprocess-143" > < span class = "linenos" > 143< / span > < / a > < span class = "sd" > expression to SQL, using an appropriate `Generator.TRANSFORMS` function.< / span >
< / span > < span id = "preprocess-144" > < a href = "#preprocess-144" > < span class = "linenos" > 144< / span > < / a >
< / span > < span id = "preprocess-145" > < a href = "#preprocess-145" > < span class = "linenos" > 145< / span > < / a > < span class = "sd" > Args:< / span >
< / span > < span id = "preprocess-146" > < a href = "#preprocess-146" > < span class = "linenos" > 146< / span > < / a > < span class = "sd" > transforms: sequence of transform functions. These will be called in order.< / span >
< / span > < span id = "preprocess-147" > < a href = "#preprocess-147" > < span class = "linenos" > 147< / span > < / a > < span class = "sd" > to_sql: final transform that converts the resulting expression to a SQL string.< / span >
< / span > < span id = "preprocess-148" > < a href = "#preprocess-148" > < span class = "linenos" > 148< / span > < / a >
< / span > < span id = "preprocess-149" > < a href = "#preprocess-149" > < span class = "linenos" > 149< / span > < / a > < span class = "sd" > Returns:< / span >
< / span > < span id = "preprocess-150" > < a href = "#preprocess-150" > < span class = "linenos" > 150< / span > < / a > < span class = "sd" > Function that can be used as a generator transform.< / span >
< / span > < span id = "preprocess-151" > < a href = "#preprocess-151" > < span class = "linenos" > 151< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "preprocess-152" > < a href = "#preprocess-152" > < span class = "linenos" > 152< / span > < / a >
< / span > < span id = "preprocess-153" > < a href = "#preprocess-153" > < span class = "linenos" > 153< / span > < / a > < span class = "k" > def< / 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 > < span id = "preprocess-154" > < a href = "#preprocess-154" > < span class = "linenos" > 154< / 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 = "o" > .< / span > < span class = "n" > copy< / span > < span class = "p" > ())< / span >
< / span > < span id = "preprocess-155" > < a href = "#preprocess-155" > < span class = "linenos" > 155< / span > < / a > < span class = "k" > for< / span > < span class = "n" > t< / 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-156" > < a href = "#preprocess-156" > < span class = "linenos" > 156< / span > < / a > < span class = "n" > expression< / span > < span class = "o" > =< / span > < span class = "n" > t< / span > < span class = "p" > (< / span > < span class = "n" > expression< / span > < span class = "p" > )< / span >
< / span > < span id = "preprocess-157" > < a href = "#preprocess-157" > < span class = "linenos" > 157< / span > < / a > < span class = "k" > return< / span > < span class = "n" > 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 > < span id = "preprocess-158" > < a href = "#preprocess-158" > < span class = "linenos" > 158< / span > < / a >
< / span > < span id = "preprocess-159" > < a href = "#preprocess-159" > < span class = "linenos" > 159< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _to_sql< / span >
2025-02-13 15:22:50 +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 an appropriate < code > Generator.TRANSFORMS< / code > function.< / p >
< h6 id = "arguments" > Arguments:< / h6 >
< ul >
< li > < strong > transforms:< / strong > sequence of transform functions. These will be called in order.< / li >
< li > < strong > to_sql:< / strong > final transform that converts the resulting expression to a SQL string.< / li >
< / ul >
< h6 id = "returns" > Returns:< / h6 >
< blockquote >
< p > Function that can be used as a generator transform.< / p >
< / blockquote >
< / div >
< / section >
< section id = "delegate" >
< input id = "delegate-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" > delegate< / span > < span class = "signature pdoc-code condensed" > (< span class = "param" > < span class = "n" > attr< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < / span > < span class = "return-annotation" > ) -> < span class = "n" > Callable< / span > :< / span > < / span >
< label class = "view-source-button" for = "delegate-view-source" > < span > View Source< / span > < / label >
< / div >
< a class = "headerlink" href = "#delegate" > < / a >
2025-02-13 15:45:33 +01:00
< div class = "pdoc-code codehilite" > < pre > < span > < / span > < span id = "delegate-162" > < a href = "#delegate-162" > < span class = "linenos" > 162< / span > < / a > < span class = "k" > def< / span > < span class = "nf" > delegate< / span > < span class = "p" > (< / span > < span class = "n" > attr< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < 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 > < span id = "delegate-163" > < a href = "#delegate-163" > < span class = "linenos" > 163< / span > < / a > < span class = "w" > < / span > < span class = "sd" > " " " < / span >
< / span > < span id = "delegate-164" > < a href = "#delegate-164" > < span class = "linenos" > 164< / span > < / a > < span class = "sd" > Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`< / span >
< / span > < span id = "delegate-165" > < a href = "#delegate-165" > < span class = "linenos" > 165< / span > < / a > < span class = "sd" > functions that delegate to existing generator methods.< / span >
< / span > < span id = "delegate-166" > < a href = "#delegate-166" > < span class = "linenos" > 166< / span > < / a > < span class = "sd" > " " " < / span >
< / span > < span id = "delegate-167" > < a href = "#delegate-167" > < span class = "linenos" > 167< / span > < / a >
< / span > < span id = "delegate-168" > < a href = "#delegate-168" > < span class = "linenos" > 168< / span > < / a > < span class = "k" > def< / span > < span class = "nf" > _transform< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > ):< / span >
< / span > < span id = "delegate-169" > < a href = "#delegate-169" > < span class = "linenos" > 169< / span > < / a > < span class = "k" > return< / span > < span class = "nb" > getattr< / span > < span class = "p" > (< / span > < span class = "bp" > self< / span > < span class = "p" > ,< / span > < span class = "n" > attr< / span > < span class = "p" > )(< / span > < span class = "o" > *< / span > < span class = "n" > args< / span > < span class = "p" > ,< / span > < span class = "o" > **< / span > < span class = "n" > kwargs< / span > < span class = "p" > )< / span >
< / span > < span id = "delegate-170" > < a href = "#delegate-170" > < span class = "linenos" > 170< / span > < / a >
< / span > < span id = "delegate-171" > < a href = "#delegate-171" > < span class = "linenos" > 171< / span > < / a > < span class = "k" > return< / span > < span class = "n" > _transform< / span >
2025-02-13 15:22:50 +01:00
< / span > < / pre > < / div >
< div class = "docstring" > < p > Create a new method that delegates to < code > attr< / code > . This is useful for creating < code > Generator.TRANSFORMS< / code >
functions that delegate to existing generator methods.< / p >
< / div >
< / section >
< / main >
< script >
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
const originalContent = document.querySelector("main.pdoc");
let currentContent = originalContent;
function setContent(innerHTML) {
let elem;
if (innerHTML) {
elem = document.createElement("main");
elem.classList.add("pdoc");
elem.innerHTML = innerHTML;
} else {
elem = originalContent;
}
if (currentContent !== elem) {
currentContent.replaceWith(elem);
currentContent = elem;
}
}
function getSearchTerm() {
return (new URL(window.location)).searchParams.get("search");
}
const searchBox = document.querySelector(".pdoc input[type=search]");
searchBox.addEventListener("input", function () {
let url = new URL(window.location);
if (searchBox.value.trim()) {
url.hash = "";
url.searchParams.set("search", searchBox.value);
} else {
url.searchParams.delete("search");
}
history.replaceState("", "", url.toString());
onInput();
});
window.addEventListener("popstate", onInput);
let search, searchErr;
async function initialize() {
try {
search = await new Promise((resolve, reject) => {
const script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.onload = () => resolve(window.pdocSearch);
script.onerror = (e) => reject(e);
script.src = "../search.js";
document.getElementsByTagName("head")[0].appendChild(script);
});
} catch (e) {
console.error("Cannot fetch pdoc search index");
searchErr = "Cannot fetch search index.";
}
onInput();
document.querySelector("nav.pdoc").addEventListener("click", e => {
if (e.target.hash) {
searchBox.value = "";
searchBox.dispatchEvent(new Event("input"));
}
});
}
function onInput() {
setContent((() => {
const term = getSearchTerm();
if (!term) {
return null
}
if (searchErr) {
return `< h3 > Error: ${searchErr}< / h3 > `
}
if (!search) {
return "< h3 > Searching...< / h3 > "
}
window.scrollTo({top: 0, left: 0, behavior: 'auto'});
const results = search(term);
let html;
if (results.length === 0) {
html = `No search results for '${escapeHTML(term)}'.`
} else {
html = `< h4 > ${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.< / h4 > `;
}
for (let result of results.slice(0, 10)) {
let doc = result.doc;
let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
if (doc.qualname) {
url += `#${doc.qualname}`;
}
let heading;
switch (result.doc.kind) {
case "function":
if (doc.fullname.endsWith(".__init__")) {
heading = `< span class = "name" > ${doc.fullname.replace(/\.__init__$/, "")}< / span > ${doc.signature}`;
} else {
heading = `< span class = "def" > ${doc.funcdef}< / span > < span class = "name" > ${doc.fullname}< / span > ${doc.signature}`;
}
break;
case "class":
heading = `< span class = "def" > class< / span > < span class = "name" > ${doc.fullname}< / span > `;
if (doc.bases)
heading += `< wbr > (< span class = "base" > ${doc.bases}< / span > )`;
heading += `:`;
break;
case "variable":
heading = `< span class = "name" > ${doc.fullname}< / span > `;
if (doc.annotation)
heading += `< span class = "annotation" > ${doc.annotation}< / span > `;
if (doc.default_value)
2025-02-13 15:31:44 +01:00
heading += `< span class = "default_value" > = ${doc.default_value}< / span > `;
2025-02-13 15:22:50 +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 >