@@ -8937,6 +8937,76 @@ fn parse_map_access_expr() {
89378937 }
89388938}
89398939
8940+ #[ test]
8941+ fn test_selective_aggregation ( ) {
8942+ let sql = concat ! (
8943+ "SELECT " ,
8944+ "ARRAY_AGG(name) FILTER (WHERE name IS NOT NULL), " ,
8945+ "ARRAY_AGG(name) FILTER (WHERE name LIKE 'a%') AS agg2 " ,
8946+ "FROM region"
8947+ ) ;
8948+ assert_eq ! (
8949+ all_dialects_where( |d| d. supports_filter_during_aggregation( ) )
8950+ . verified_only_select( sql)
8951+ . projection,
8952+ vec![
8953+ SelectItem :: UnnamedExpr ( Expr :: AggregateExpressionWithFilter {
8954+ expr: Box :: new( Expr :: ArrayAgg ( ArrayAgg {
8955+ distinct: false ,
8956+ expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
8957+ order_by: None ,
8958+ limit: None ,
8959+ within_group: false ,
8960+ } ) ) ,
8961+ filter: Box :: new( Expr :: IsNotNull ( Box :: new( Expr :: Identifier ( Ident :: new(
8962+ "name"
8963+ ) ) ) ) ) ,
8964+ } ) ,
8965+ SelectItem :: ExprWithAlias {
8966+ expr: Expr :: AggregateExpressionWithFilter {
8967+ expr: Box :: new( Expr :: ArrayAgg ( ArrayAgg {
8968+ distinct: false ,
8969+ expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
8970+ order_by: None ,
8971+ limit: None ,
8972+ within_group: false ,
8973+ } ) ) ,
8974+ filter: Box :: new( Expr :: Like {
8975+ negated: false ,
8976+ expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
8977+ pattern: Box :: new( Expr :: Value ( Value :: SingleQuotedString ( "a%" . to_owned( ) ) ) ) ,
8978+ escape_char: None ,
8979+ } ) ,
8980+ } ,
8981+ alias: Ident :: new( "agg2" )
8982+ } ,
8983+ ]
8984+ )
8985+ }
8986+
8987+ #[ test]
8988+ fn test_group_by_grouping_sets ( ) {
8989+ let sql = concat ! (
8990+ "SELECT city, car_model, sum(quantity) AS sum " ,
8991+ "FROM dealer " ,
8992+ "GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ()) " ,
8993+ "ORDER BY city" ,
8994+ ) ;
8995+ assert_eq ! (
8996+ all_dialects_where( |d| d. supports_group_by_expr( ) )
8997+ . verified_only_select( sql)
8998+ . group_by,
8999+ GroupByExpr :: Expressions ( vec![ Expr :: GroupingSets ( vec![
9000+ vec![
9001+ Expr :: Identifier ( Ident :: new( "city" ) ) ,
9002+ Expr :: Identifier ( Ident :: new( "car_model" ) )
9003+ ] ,
9004+ vec![ Expr :: Identifier ( Ident :: new( "city" ) ) , ] ,
9005+ vec![ Expr :: Identifier ( Ident :: new( "car_model" ) ) ] ,
9006+ vec![ ]
9007+ ] ) ] )
9008+ ) ;
9009+ }
89409010#[ test]
89419011fn test_match_recognize ( ) {
89429012 use MatchRecognizePattern :: * ;
0 commit comments