@@ -149,38 +149,49 @@ TEST_F(RowNumberTest, largeInput) {
149149 createDuckDbTable ({data, data});
150150
151151 // No limit, emit row numbers.
152- auto plan = PlanBuilder ().values ({data, data}).rowNumber ({" c0" }).planNode ();
153- assertQuery (plan, " SELECT *, row_number() over (partition by c0) FROM tmp" );
152+ auto plan = PlanBuilder ()
153+ .values ({data, data})
154+ .orderBy ({" c0 ASC" , " c1 ASC" }, false )
155+ .rowNumber ({" c0" })
156+ .planNode ();
157+ assertQuery (
158+ plan,
159+ " SELECT *, row_number() over (partition by c0 ORDER BY c1) FROM tmp" );
154160
155161 // No limit, don't emit row numbers.
156162 plan = PlanBuilder ()
157163 .values ({data, data})
164+ .orderBy ({" c0 ASC" , " c1 ASC" }, false )
158165 .rowNumber ({" c0" }, std::nullopt , false )
159166 .planNode ();
160167 assertQuery (
161168 plan,
162- " SELECT c0, c1 FROM (SELECT *, row_number() over (partition by c0) as rn FROM tmp)" );
169+ " SELECT c0, c1 FROM (SELECT *, row_number() over (partition by c0 ORDER BY c1 ) as rn FROM tmp)" );
163170
164171 auto testLimit = [&](int32_t limit) {
165172 // Emit row numbers.
166- auto plan =
167- PlanBuilder ().values ({data, data}).rowNumber ({" c0" }, limit).planNode ();
173+ auto plan = PlanBuilder ()
174+ .values ({data, data})
175+ .orderBy ({" c0 ASC" , " c1 ASC" }, false )
176+ .rowNumber ({" c0" }, limit)
177+ .planNode ();
168178 assertQuery (
169179 plan,
170180 fmt::format (
171- " SELECT * FROM (SELECT *, row_number() over (partition by c0) as rn FROM tmp) "
181+ " SELECT * FROM (SELECT *, row_number() over (partition by c0 ORDER BY c1 ) as rn FROM tmp) "
172182 " WHERE rn <= {}" ,
173183 limit));
174184
175185 // Don't emit row numbers.
176186 plan = PlanBuilder ()
177187 .values ({data, data})
188+ .orderBy ({" c0 ASC" , " c1 ASC" }, false )
178189 .rowNumber ({" c0" }, limit, false )
179190 .planNode ();
180191 assertQuery (
181192 plan,
182193 fmt::format (
183- " SELECT c0, c1 FROM (SELECT *, row_number() over (partition by c0) as rn FROM tmp) "
194+ " SELECT c0, c1 FROM (SELECT *, row_number() over (partition by c0 ORDER BY c1 ) as rn FROM tmp) "
184195 " WHERE rn <= {}" ,
185196 limit));
186197 };
@@ -210,23 +221,21 @@ TEST_F(RowNumberTest, spill) {
210221 TestScopedSpillInjection scopedSpillInjection (100 , " .*" , 1 );
211222
212223 core::PlanNodeId rowNumberPlanNodeId;
213- auto task =
214- AssertQueryBuilder (duckDbQueryRunner_)
215- .spillDirectory (spillDirectory->getPath ())
216- .config (core::QueryConfig::kSpillEnabled , true )
217- .config (core::QueryConfig::kRowNumberSpillEnabled , true )
218- .config (
219- core::QueryConfig::kSpillNumPartitionBits ,
220- testData.spillPartitionBits )
221- .queryCtx (queryCtx)
222- .plan (
223- PlanBuilder ()
224- .values (vectors)
225- .rowNumber ({" c0" })
226- .capturePlanNodeId (rowNumberPlanNodeId)
227- .planNode ())
228- .assertResults (
229- " SELECT *, row_number() over (partition by c0) FROM tmp" );
224+ auto task = AssertQueryBuilder (duckDbQueryRunner_)
225+ .spillDirectory (spillDirectory->getPath ())
226+ .config (core::QueryConfig::kSpillEnabled , true )
227+ .config (core::QueryConfig::kRowNumberSpillEnabled , true )
228+ .config (
229+ core::QueryConfig::kSpillNumPartitionBits ,
230+ testData.spillPartitionBits )
231+ .queryCtx (queryCtx)
232+ .plan (
233+ PlanBuilder ()
234+ .values (vectors)
235+ .rowNumber ({" c0" }, std::nullopt , false )
236+ .capturePlanNodeId (rowNumberPlanNodeId)
237+ .planNode ())
238+ .assertResults (" SELECT c0, c1, c2, c3 FROM tmp" );
230239 auto taskStats = toPlanStats (task->taskStats ());
231240 auto & planStats = taskStats.at (rowNumberPlanNodeId);
232241 ASSERT_GT (planStats.spilledBytes , 0 );
@@ -399,23 +408,21 @@ DEBUG_ONLY_TEST_F(RowNumberTest, spillOnlyDuringInputOrOutput) {
399408 })));
400409
401410 core::PlanNodeId rowNumberPlanNodeId;
402- auto task =
403- AssertQueryBuilder (duckDbQueryRunner_)
404- .spillDirectory (spillDirectory->getPath ())
405- .config (core::QueryConfig::kSpillEnabled , true )
406- .config (core::QueryConfig::kRowNumberSpillEnabled , true )
407- .config (
408- core::QueryConfig::kSpillNumPartitionBits ,
409- testData.spillPartitionBits )
410- .queryCtx (queryCtx)
411- .plan (
412- PlanBuilder ()
413- .values (vectors)
414- .rowNumber ({" c0" })
415- .capturePlanNodeId (rowNumberPlanNodeId)
416- .planNode ())
417- .assertResults (
418- " SELECT *, row_number() over (partition by c0) FROM tmp" );
411+ auto task = AssertQueryBuilder (duckDbQueryRunner_)
412+ .spillDirectory (spillDirectory->getPath ())
413+ .config (core::QueryConfig::kSpillEnabled , true )
414+ .config (core::QueryConfig::kRowNumberSpillEnabled , true )
415+ .config (
416+ core::QueryConfig::kSpillNumPartitionBits ,
417+ testData.spillPartitionBits )
418+ .queryCtx (queryCtx)
419+ .plan (
420+ PlanBuilder ()
421+ .values (vectors)
422+ .rowNumber ({" c0" }, std::nullopt , false )
423+ .capturePlanNodeId (rowNumberPlanNodeId)
424+ .planNode ())
425+ .assertResults (" SELECT c0, c1, c2, c3 FROM tmp" );
419426 auto taskStats = toPlanStats (task->taskStats ());
420427 auto & planStats = taskStats.at (rowNumberPlanNodeId);
421428 ASSERT_GT (planStats.spilledBytes , 0 );
@@ -496,11 +503,10 @@ DEBUG_ONLY_TEST_F(RowNumberTest, recursiveSpill) {
496503 .plan (
497504 PlanBuilder ()
498505 .values (vectors)
499- .rowNumber ({" c0" })
506+ .rowNumber ({" c0" }, std:: nullopt , false )
500507 .capturePlanNodeId (rowNumberPlanNodeId)
501508 .planNode ())
502- .assertResults (
503- " SELECT *, row_number() over (partition by c0) FROM tmp" );
509+ .assertResults (" SELECT c0, c1, c2, c3 FROM tmp" );
504510 auto taskStats = toPlanStats (task->taskStats ());
505511 auto & planStats = taskStats.at (rowNumberPlanNodeId);
506512 ASSERT_GT (planStats.spilledBytes , 0 );
@@ -547,23 +553,21 @@ TEST_F(RowNumberTest, spillWithYield) {
547553 auto queryCtx = core::QueryCtx::create (executor_.get ());
548554
549555 core::PlanNodeId rowNumberPlanNodeId;
550- auto task =
551- AssertQueryBuilder (duckDbQueryRunner_)
552- .spillDirectory (spillDirectory->getPath ())
553- .config (core::QueryConfig::kSpillEnabled , true )
554- .config (core::QueryConfig::kRowNumberSpillEnabled , true )
555- .config (
556- core::QueryConfig::kDriverCpuTimeSliceLimitMs ,
557- testData.cpuTimeSliceLimitMs )
558- .queryCtx (queryCtx)
559- .plan (
560- PlanBuilder ()
561- .values (vectors)
562- .rowNumber ({" c0" })
563- .capturePlanNodeId (rowNumberPlanNodeId)
564- .planNode ())
565- .assertResults (
566- " SELECT *, row_number() over (partition by c0) FROM tmp" );
556+ auto task = AssertQueryBuilder (duckDbQueryRunner_)
557+ .spillDirectory (spillDirectory->getPath ())
558+ .config (core::QueryConfig::kSpillEnabled , true )
559+ .config (core::QueryConfig::kRowNumberSpillEnabled , true )
560+ .config (
561+ core::QueryConfig::kDriverCpuTimeSliceLimitMs ,
562+ testData.cpuTimeSliceLimitMs )
563+ .queryCtx (queryCtx)
564+ .plan (
565+ PlanBuilder ()
566+ .values (vectors)
567+ .rowNumber ({" c0" }, std::nullopt , false )
568+ .capturePlanNodeId (rowNumberPlanNodeId)
569+ .planNode ())
570+ .assertResults (" SELECT c0, c1, c2, c3 FROM tmp" );
567571 auto taskStats = toPlanStats (task->taskStats ());
568572 auto & planStats = taskStats.at (rowNumberPlanNodeId);
569573 ASSERT_GT (planStats.spilledBytes , 0 );
0 commit comments