Skip to content

Commit bbcdeb9

Browse files
committed
Fix fast-path plan creation to be mindful of the finishing's offset
1 parent f4f99cb commit bbcdeb9

2 files changed

Lines changed: 88 additions & 2 deletions

File tree

src/adapter/src/coord/peek.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,13 +465,16 @@ pub fn create_fast_path_plan<T: Timestamp>(
465465
{
466466
if let Some(finishing) = finishing {
467467
if group_key.is_empty() && *order_key == finishing.order_by && *offset == 0 {
468-
// The following is roughly `limit >= finishing.limit`, but with Options.
468+
// The following is roughly `limit >= finishing.limit + finishing.offset`,
469+
// but with Options.
469470
let finishing_limits_at_least_as_topk = match (limit, finishing.limit) {
470471
(None, _) => true,
471472
(Some(..), None) => false,
472473
(Some(topk_limit), Some(finishing_limit)) => {
473474
if let Some(l) = topk_limit.as_literal_int64() {
474-
l >= *finishing_limit
475+
i128::cast_from(l)
476+
>= i128::cast_from(*finishing_limit)
477+
+ i128::cast_from(finishing.offset)
475478
} else {
476479
false
477480
}

test/sqllogictest/topk.slt

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,86 @@ Source materialize.public.cities
183183
Target cluster: quickstart
184184

185185
EOF
186+
187+
# Regression test for https://github.com/MaterializeInc/database-issues/issues/11292
188+
# i.e., that when `create_fast_path_plan` jumps through a TopK, it correctly takes into account the finishing's offset.
189+
statement ok
190+
CREATE TABLE t (x int);
191+
192+
statement ok
193+
INSERT INTO t VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
194+
195+
query I
196+
SELECT * FROM (SELECT * FROM t LIMIT 12) LIMIT 10 OFFSET 5;
197+
----
198+
6
199+
7
200+
8
201+
9
202+
10
203+
11
204+
12
205+
206+
query I
207+
SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 12) ORDER BY x LIMIT 10 OFFSET 5;
208+
----
209+
6
210+
7
211+
8
212+
9
213+
10
214+
11
215+
12
216+
217+
query I
218+
SELECT * FROM (SELECT * FROM t LIMIT 15) LIMIT 10 OFFSET 5;
219+
----
220+
6
221+
7
222+
8
223+
9
224+
10
225+
11
226+
12
227+
13
228+
14
229+
15
230+
231+
statement ok
232+
CREATE DEFAULT INDEX ON t;
233+
234+
query I
235+
SELECT * FROM (SELECT * FROM t LIMIT 12) LIMIT 10 OFFSET 5;
236+
----
237+
6
238+
7
239+
8
240+
9
241+
10
242+
11
243+
12
244+
245+
query I
246+
SELECT * FROM (SELECT * FROM t ORDER BY x LIMIT 12) ORDER BY x LIMIT 10 OFFSET 5;
247+
----
248+
6
249+
7
250+
8
251+
9
252+
10
253+
11
254+
12
255+
256+
query I
257+
SELECT * FROM (SELECT * FROM t LIMIT 15) LIMIT 10 OFFSET 5;
258+
----
259+
6
260+
7
261+
8
262+
9
263+
10
264+
11
265+
12
266+
13
267+
14
268+
15

0 commit comments

Comments
 (0)