@@ -278,6 +278,12 @@ pub enum Expr {
278278 Subquery ( Box < Query > ) ,
279279 /// The `LISTAGG` function `SELECT LISTAGG(...) WITHIN GROUP (ORDER BY ...)`
280280 ListAgg ( ListAgg ) ,
281+ /// The `GROUPING SETS` expr.
282+ GroupingSets ( Vec < Vec < Expr > > ) ,
283+ /// The `CUBE` expr.
284+ Cube ( Vec < Vec < Expr > > ) ,
285+ /// The `ROLLUP` expr.
286+ Rollup ( Vec < Vec < Expr > > ) ,
281287}
282288
283289impl fmt:: Display for Expr {
@@ -376,6 +382,44 @@ impl fmt::Display for Expr {
376382 Expr :: Exists ( s) => write ! ( f, "EXISTS ({})" , s) ,
377383 Expr :: Subquery ( s) => write ! ( f, "({})" , s) ,
378384 Expr :: ListAgg ( listagg) => write ! ( f, "{}" , listagg) ,
385+ Expr :: GroupingSets ( sets) => {
386+ write ! ( f, "GROUPING SETS (" ) ?;
387+ let mut sep = "" ;
388+ for set in sets {
389+ write ! ( f, "{}" , sep) ?;
390+ sep = ", " ;
391+ write ! ( f, "({})" , display_comma_separated( set) ) ?;
392+ }
393+ write ! ( f, ")" )
394+ }
395+ Expr :: Cube ( sets) => {
396+ write ! ( f, "CUBE (" ) ?;
397+ let mut sep = "" ;
398+ for set in sets {
399+ write ! ( f, "{}" , sep) ?;
400+ sep = ", " ;
401+ if set. len ( ) == 1 {
402+ write ! ( f, "{}" , set[ 0 ] ) ?;
403+ } else {
404+ write ! ( f, "({})" , display_comma_separated( set) ) ?;
405+ }
406+ }
407+ write ! ( f, ")" )
408+ }
409+ Expr :: Rollup ( sets) => {
410+ write ! ( f, "ROLLUP (" ) ?;
411+ let mut sep = "" ;
412+ for set in sets {
413+ write ! ( f, "{}" , sep) ?;
414+ sep = ", " ;
415+ if set. len ( ) == 1 {
416+ write ! ( f, "{}" , set[ 0 ] ) ?;
417+ } else {
418+ write ! ( f, "({})" , display_comma_separated( set) ) ?;
419+ }
420+ }
421+ write ! ( f, ")" )
422+ }
379423 Expr :: Substring {
380424 expr,
381425 substring_from,
@@ -1903,4 +1947,93 @@ mod tests {
19031947 let window_frame = WindowFrame :: default ( ) ;
19041948 assert_eq ! ( WindowFrameBound :: Preceding ( None ) , window_frame. start_bound) ;
19051949 }
1950+
1951+ #[ test]
1952+ fn test_grouping_sets_display ( ) {
1953+ // a and b in different group
1954+ let grouping_sets = Expr :: GroupingSets ( vec ! [
1955+ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
1956+ vec![ Expr :: Identifier ( Ident :: new( "b" ) ) ] ,
1957+ ] ) ;
1958+ assert_eq ! ( "GROUPING SETS ((a), (b))" , format!( "{}" , grouping_sets) ) ;
1959+
1960+ // a and b in the same group
1961+ let grouping_sets = Expr :: GroupingSets ( vec ! [ vec![
1962+ Expr :: Identifier ( Ident :: new( "a" ) ) ,
1963+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
1964+ ] ] ) ;
1965+ assert_eq ! ( "GROUPING SETS ((a, b))" , format!( "{}" , grouping_sets) ) ;
1966+
1967+ // (a, b) and (c, d) in different group
1968+ let grouping_sets = Expr :: GroupingSets ( vec ! [
1969+ vec![
1970+ Expr :: Identifier ( Ident :: new( "a" ) ) ,
1971+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
1972+ ] ,
1973+ vec![
1974+ Expr :: Identifier ( Ident :: new( "c" ) ) ,
1975+ Expr :: Identifier ( Ident :: new( "d" ) ) ,
1976+ ] ,
1977+ ] ) ;
1978+ assert_eq ! (
1979+ "GROUPING SETS ((a, b), (c, d))" ,
1980+ format!( "{}" , grouping_sets)
1981+ ) ;
1982+ }
1983+
1984+ #[ test]
1985+ fn test_rollup_display ( ) {
1986+ let rollup = Expr :: Rollup ( vec ! [ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ] ) ;
1987+ assert_eq ! ( "ROLLUP (a)" , format!( "{}" , rollup) ) ;
1988+
1989+ let rollup = Expr :: Rollup ( vec ! [ vec![
1990+ Expr :: Identifier ( Ident :: new( "a" ) ) ,
1991+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
1992+ ] ] ) ;
1993+ assert_eq ! ( "ROLLUP ((a, b))" , format!( "{}" , rollup) ) ;
1994+
1995+ let rollup = Expr :: Rollup ( vec ! [
1996+ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
1997+ vec![ Expr :: Identifier ( Ident :: new( "b" ) ) ] ,
1998+ ] ) ;
1999+ assert_eq ! ( "ROLLUP (a, b)" , format!( "{}" , rollup) ) ;
2000+
2001+ let rollup = Expr :: Rollup ( vec ! [
2002+ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
2003+ vec![
2004+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
2005+ Expr :: Identifier ( Ident :: new( "c" ) ) ,
2006+ ] ,
2007+ vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
2008+ ] ) ;
2009+ assert_eq ! ( "ROLLUP (a, (b, c), d)" , format!( "{}" , rollup) ) ;
2010+ }
2011+
2012+ #[ test]
2013+ fn test_cube_display ( ) {
2014+ let cube = Expr :: Cube ( vec ! [ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ] ) ;
2015+ assert_eq ! ( "CUBE (a)" , format!( "{}" , cube) ) ;
2016+
2017+ let cube = Expr :: Cube ( vec ! [ vec![
2018+ Expr :: Identifier ( Ident :: new( "a" ) ) ,
2019+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
2020+ ] ] ) ;
2021+ assert_eq ! ( "CUBE ((a, b))" , format!( "{}" , cube) ) ;
2022+
2023+ let cube = Expr :: Cube ( vec ! [
2024+ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
2025+ vec![ Expr :: Identifier ( Ident :: new( "b" ) ) ] ,
2026+ ] ) ;
2027+ assert_eq ! ( "CUBE (a, b)" , format!( "{}" , cube) ) ;
2028+
2029+ let cube = Expr :: Cube ( vec ! [
2030+ vec![ Expr :: Identifier ( Ident :: new( "a" ) ) ] ,
2031+ vec![
2032+ Expr :: Identifier ( Ident :: new( "b" ) ) ,
2033+ Expr :: Identifier ( Ident :: new( "c" ) ) ,
2034+ ] ,
2035+ vec![ Expr :: Identifier ( Ident :: new( "d" ) ) ] ,
2036+ ] ) ;
2037+ assert_eq ! ( "CUBE (a, (b, c), d)" , format!( "{}" , cube) ) ;
2038+ }
19062039}
0 commit comments