Apply LIMIT and OFFSET to a plan.
(mut plan: SqlPlan, limit_clause: &Option<ast::LimitClause>)
| 334 | |
| 335 | /// Apply LIMIT and OFFSET to a plan. |
| 336 | fn apply_limit(mut plan: SqlPlan, limit_clause: &Option<ast::LimitClause>) -> SqlPlan { |
| 337 | let (limit_val, offset_val) = match limit_clause { |
| 338 | None => (None, 0usize), |
| 339 | Some(ast::LimitClause::LimitOffset { limit, offset, .. }) => { |
| 340 | let lv = limit |
| 341 | .as_ref() |
| 342 | .and_then(crate::coerce::expr_as_usize_literal); |
| 343 | let ov = offset |
| 344 | .as_ref() |
| 345 | .and_then(|o| crate::coerce::expr_as_usize_literal(&o.value)) |
| 346 | .unwrap_or(0); |
| 347 | (lv, ov) |
| 348 | } |
| 349 | Some(ast::LimitClause::OffsetCommaLimit { offset, limit }) => { |
| 350 | let lv = crate::coerce::expr_as_usize_literal(limit); |
| 351 | let ov = crate::coerce::expr_as_usize_literal(offset).unwrap_or(0); |
| 352 | (lv, ov) |
| 353 | } |
| 354 | }; |
| 355 | |
| 356 | match plan { |
| 357 | SqlPlan::Scan { |
| 358 | ref mut limit, |
| 359 | ref mut offset, |
| 360 | .. |
| 361 | } => { |
| 362 | *limit = limit_val; |
| 363 | *offset = offset_val; |
| 364 | } |
| 365 | SqlPlan::Aggregate { |
| 366 | limit: ref mut l, .. |
| 367 | } => { |
| 368 | if let Some(lv) = limit_val { |
| 369 | *l = lv; |
| 370 | } |
| 371 | } |
| 372 | SqlPlan::VectorSearch { |
| 373 | top_k: ref mut k, |
| 374 | ef_search: ref mut ef, |
| 375 | ann_options: ref opts, |
| 376 | .. |
| 377 | } => { |
| 378 | // Fused VectorSearch (e.g. ORDER BY vector_distance + JOIN |
| 379 | // ARRAY_SLICE) inherits its outer LIMIT here. Without this, |
| 380 | // a join-derived VectorSearch carries the join's default |
| 381 | // 10000 limit instead of the user's `LIMIT N`. |
| 382 | if let Some(lv) = limit_val { |
| 383 | *k = lv; |
| 384 | *ef = opts |
| 385 | .ef_search_override |
| 386 | .unwrap_or(lv * DEFAULT_EF_SEARCH_MULTIPLIER); |
| 387 | } |
| 388 | } |
| 389 | _ => {} |
| 390 | } |
| 391 | plan |
| 392 | } |
| 393 |
no test coverage detected