Skip to content

Commit 296b23a

Browse files
committed
use original order columns for suboptimal case
1 parent 28727d6 commit 296b23a

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

rust/cubestore/cubestore-sql-tests/src/tests.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8005,6 +8005,10 @@ async fn limit_pushdown_without_group(service: Box<dyn SqlClient>) {
80058005
.exec_query("CREATE TABLE foo.pushdown_where_group2_with_alias (a_alias int, b_alias int, c_alias int) index ind1 (a_alias, b_alias, c_alias) index ind2 (c_alias, b_alias)")
80068006
.await
80078007
.unwrap();
8008+
service
8009+
.exec_query("CREATE TABLE foo.pushdown_where_group3_with_alias (a_alias int, b_alias int, c_alias int) index ind1 (c_alias, b_alias)")
8010+
.await
8011+
.unwrap();
80088012
service
80098013
.exec_query(
80108014
"INSERT INTO foo.pushdown_where_group1
@@ -8318,6 +8322,38 @@ async fn limit_pushdown_without_group(service: Box<dyn SqlClient>) {
83188322
)
83198323
.await
83208324
.unwrap();
8325+
8326+
// ====================================
8327+
assert_limit_pushdown(
8328+
&service,
8329+
"SELECT a, b, c FROM (
8330+
SELECT a_alias a, b_alias b, c_alias c FROM foo.pushdown_where_group3_with_alias
8331+
) as `tb`
8332+
WHERE a = 20
8333+
ORDER BY 3 DESC
8334+
LIMIT 3",
8335+
Some("ind1"),
8336+
true,
8337+
true,
8338+
)
8339+
.await
8340+
.unwrap();
8341+
8342+
// ====================================
8343+
assert_limit_pushdown(
8344+
&service,
8345+
"SELECT a, b, c FROM (
8346+
SELECT a_alias a, b_alias b, c_alias c FROM foo.pushdown_where_group3_with_alias
8347+
) as `tb`
8348+
WHERE a > 20
8349+
ORDER BY 3 DESC
8350+
LIMIT 3",
8351+
Some("ind1"),
8352+
true,
8353+
true,
8354+
)
8355+
.await
8356+
.unwrap();
83218357
}
83228358
async fn limit_pushdown_without_group_resort(service: Box<dyn SqlClient>) {
83238359
service.exec_query("CREATE SCHEMA foo").await.unwrap();

rust/cubestore/cubestore/src/queryplanner/planning.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@ impl<'a> PlanIndexStore for &'a dyn MetaStore {
389389
#[derive(Clone)]
390390
struct SortColumns {
391391
sort_on: Vec<String>,
392+
sort_on_order_col_only: Vec<String>,
392393
required: bool,
393394
}
394395

@@ -461,12 +462,18 @@ impl PlanRewriter for CollectConstraints {
461462
.map(|n| n.clone())
462463
.unique()
463464
.collect::<Vec<_>>(),
465+
sort_on_order_col_only: order_col_names
466+
.iter()
467+
.map(|n| n.clone())
468+
.unique()
469+
.collect::<Vec<_>>(),
464470
required: s.required,
465471
})
466472
}
467473
}
468474
None => Some(SortColumns {
469475
sort_on: order_col_names.clone(),
476+
sort_on_order_col_only: vec![],
470477
required: false,
471478
}),
472479
}
@@ -508,6 +515,7 @@ impl PlanRewriter for CollectConstraints {
508515
let sort_on = if !sort_on.is_empty() && sort_on.iter().all(|c| c.is_some()) {
509516
Some(SortColumns {
510517
sort_on: sort_on.into_iter().map(|c| c.unwrap()).collect(),
518+
sort_on_order_col_only: vec![],
511519
required: false,
512520
})
513521
} else {
@@ -555,6 +563,7 @@ impl PlanRewriter for CollectConstraints {
555563
if single_value_filter_columns(predicate, &mut sort_on) {
556564
if !sort_on.is_empty() {
557565
let sort_on = Some(SortColumns {
566+
sort_on_order_col_only: vec![],
558567
sort_on: sort_on
559568
.into_iter()
560569
.map(|c| c.name.to_string())
@@ -591,6 +600,7 @@ impl PlanRewriter for CollectConstraints {
591600
}
592601
Some(ConstraintsContext {
593602
sort_on: Some(SortColumns {
603+
sort_on_order_col_only: vec![],
594604
sort_on: join_on.iter().map(|(l, _)| l.name.clone()).collect(),
595605
required: true,
596606
}),
@@ -612,6 +622,7 @@ impl PlanRewriter for CollectConstraints {
612622
}
613623
Some(ConstraintsContext {
614624
sort_on: Some(SortColumns {
625+
sort_on_order_col_only: vec![],
615626
sort_on: join_on.iter().map(|(_, r)| r.name.clone()).collect(),
616627
required: true,
617628
}),
@@ -1060,6 +1071,10 @@ async fn pick_index(
10601071
indices: Vec<IdRow<Index>>,
10611072
) -> Result<IndexCandidate, DataFusionError> {
10621073
let sort_on = c.sort_on.as_ref().map(|sc| (&sc.sort_on, sc.required));
1074+
let sort_on_order_col_only = c
1075+
.sort_on
1076+
.as_ref()
1077+
.map(|sc| (&sc.sort_on_order_col_only, sc.required));
10631078

10641079
let aggr_index_allowed = check_aggregates_expr(&table, &c.aggregates);
10651080

@@ -1180,12 +1195,14 @@ async fn pick_index(
11801195
&projection_columns,
11811196
&filter_columns,
11821197
);
1183-
11841198
let index = optimal.unwrap_or(default_index);
11851199
(
11861200
Ok(index),
11871201
index.get_row().multi_index_id().map(|_| index),
1188-
None,
1202+
match sort_on_order_col_only {
1203+
Some((columns, flag)) if !columns.is_empty() => Some((columns, flag)),
1204+
_ => None,
1205+
},
11891206
)
11901207
}
11911208
}

0 commit comments

Comments
 (0)