@@ -175,6 +175,83 @@ async fn count_aggregated_cube() -> Result<()> {
175175 Ok ( ( ) )
176176}
177177
178+ #[ tokio:: test]
179+ async fn duplicate_grouping_sets_are_preserved ( ) -> Result < ( ) > {
180+ let ctx = SessionContext :: new ( ) ;
181+ let schema = Arc :: new ( Schema :: new ( vec ! [
182+ Field :: new( "deptno" , DataType :: Int32 , false ) ,
183+ Field :: new( "job" , DataType :: Utf8 , true ) ,
184+ Field :: new( "sal" , DataType :: Int32 , true ) ,
185+ Field :: new( "comm" , DataType :: Int32 , true ) ,
186+ ] ) ) ;
187+ let batch = RecordBatch :: try_new (
188+ Arc :: clone ( & schema) ,
189+ vec ! [
190+ Arc :: new( Int32Array :: from( vec![ 10 , 20 ] ) ) ,
191+ Arc :: new( StringArray :: from( vec![ Some ( "CLERK" ) , Some ( "MANAGER" ) ] ) ) ,
192+ Arc :: new( Int32Array :: from( vec![ 1300 , 3000 ] ) ) ,
193+ Arc :: new( Int32Array :: from( vec![ None , None ] ) ) ,
194+ ] ,
195+ ) ?;
196+ let provider = MemTable :: try_new ( Arc :: clone ( & schema) , vec ! [ vec![ batch] ] ) ?;
197+ ctx. register_table ( "dup_grouping_sets" , Arc :: new ( provider) ) ?;
198+
199+ let results = plan_and_collect (
200+ & ctx,
201+ "
202+ SELECT deptno, job, sal, sum(comm) AS sum_comm,
203+ grouping(deptno) AS deptno_flag,
204+ grouping(job) AS job_flag,
205+ grouping(sal) AS sal_flag
206+ FROM dup_grouping_sets
207+ GROUP BY GROUPING SETS ((deptno, job), (deptno, sal), (deptno, job))
208+ ORDER BY deptno, job, sal, deptno_flag, job_flag, sal_flag
209+ " ,
210+ )
211+ . await ?;
212+
213+ assert_eq ! ( results. len( ) , 1 ) ;
214+ assert_snapshot ! ( batches_to_string( & results) , @r"
215+ +--------+---------+------+----------+-------------+----------+----------+
216+ | deptno | job | sal | sum_comm | deptno_flag | job_flag | sal_flag |
217+ +--------+---------+------+----------+-------------+----------+----------+
218+ | 10 | CLERK | | | 0 | 0 | 1 |
219+ | 10 | CLERK | | | 0 | 0 | 1 |
220+ | 10 | | 1300 | | 0 | 1 | 0 |
221+ | 20 | MANAGER | | | 0 | 0 | 1 |
222+ | 20 | MANAGER | | | 0 | 0 | 1 |
223+ | 20 | | 3000 | | 0 | 1 | 0 |
224+ +--------+---------+------+----------+-------------+----------+----------+
225+ " ) ;
226+
227+ let results = plan_and_collect (
228+ & ctx,
229+ "
230+ SELECT deptno, job, sal,
231+ grouping(deptno, job, sal) AS grouping_id
232+ FROM dup_grouping_sets
233+ GROUP BY GROUPING SETS ((deptno, job), (deptno, sal), (deptno, job))
234+ ORDER BY deptno, job, sal, grouping_id
235+ " ,
236+ )
237+ . await ?;
238+
239+ assert_eq ! ( results. len( ) , 1 ) ;
240+ assert_snapshot ! ( batches_to_string( & results) , @r"
241+ +--------+---------+------+-------------+
242+ | deptno | job | sal | grouping_id |
243+ +--------+---------+------+-------------+
244+ | 10 | CLERK | | 1 |
245+ | 10 | CLERK | | 1 |
246+ | 10 | | 1300 | 2 |
247+ | 20 | MANAGER | | 1 |
248+ | 20 | MANAGER | | 1 |
249+ | 20 | | 3000 | 2 |
250+ +--------+---------+------+-------------+
251+ " ) ;
252+ Ok ( ( ) )
253+ }
254+
178255async fn run_count_distinct_integers_aggregated_scenario (
179256 partitions : Vec < Vec < ( & str , u64 ) > > ,
180257) -> Result < Vec < RecordBatch > > {
0 commit comments