Skip to content

Commit 240947f

Browse files
committed
fix(cubesql): Add checks that projection/filters/fetch in TableScan is empty
1 parent e02f612 commit 240947f

File tree

1 file changed

+40
-3
lines changed
  • rust/cubesql/cubesql/src/compile/rewrite/rules

1 file changed

+40
-3
lines changed

rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ use crate::{
2323
LimitFetch, LimitSkip, ListType, LiteralExprValue, LiteralMemberRelation,
2424
LiteralMemberValue, LogicalPlanLanguage, MeasureName, MemberErrorAliasToCube,
2525
MemberErrorError, MemberErrorPriority, MemberPushdownReplacerAliasToCube,
26-
MemberReplacerAliasToCube, ProjectionAlias, SegmentName, TableScanSourceTableName,
27-
TableScanTableName, TimeDimensionDateRange, TimeDimensionGranularity, TimeDimensionName,
28-
VirtualFieldCube, VirtualFieldName,
26+
MemberReplacerAliasToCube, ProjectionAlias, SegmentName, TableScanFetch,
27+
TableScanProjection, TableScanSourceTableName, TableScanTableName, TimeDimensionDateRange,
28+
TimeDimensionGranularity, TimeDimensionName, VirtualFieldCube, VirtualFieldName,
2929
},
3030
config::ConfigObj,
3131
transport::{MetaContext, V1CubeMetaDimensionExt, V1CubeMetaExt, V1CubeMetaMeasureExt},
@@ -81,6 +81,9 @@ impl RewriteRules for MemberRules {
8181
self.transform_table_scan(
8282
"?source_table_name",
8383
"?table_name",
84+
"?projection",
85+
"?filters",
86+
"?fetch",
8487
"?alias_to_cube",
8588
"?cube_scan_members",
8689
),
@@ -1135,15 +1138,49 @@ impl MemberRules {
11351138
&self,
11361139
source_table_name_var: &'static str,
11371140
table_name_var: &'static str,
1141+
table_scan_projection_var: &'static str,
1142+
table_scan_filters_var: &'static str,
1143+
table_scan_fetch_var: &'static str,
11381144
alias_to_cube_var: &'static str,
11391145
cube_scan_members_var: &'static str,
11401146
) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool {
11411147
let source_table_name_var = var!(source_table_name_var);
11421148
let table_name_var = var!(table_name_var);
1149+
let table_scan_projection_var = var!(table_scan_projection_var);
1150+
let table_scan_filters_var = var!(table_scan_filters_var);
1151+
let table_scan_fetch_var = var!(table_scan_fetch_var);
11431152
let alias_to_cube_var = var!(alias_to_cube_var);
11441153
let cube_scan_members_var = var!(cube_scan_members_var);
11451154
let meta_context = self.meta_context.clone();
11461155
move |egraph, subst| {
1156+
for table_projection in var_iter!(
1157+
egraph[subst[table_scan_projection_var]],
1158+
TableScanProjection
1159+
) {
1160+
if table_projection.is_some() {
1161+
// This rule always inserts AllMembersCube, so it does not support projection in TableScan
1162+
// TODO support this and enable "push projection to scan" optimizer from DF, it should help many CubeScans without members
1163+
return false;
1164+
}
1165+
}
1166+
1167+
for table_filters in
1168+
var_list_iter!(egraph[subst[table_scan_filters_var]], TableScanFilters)
1169+
{
1170+
if !table_filters.is_empty() {
1171+
// This rule always inserts empty filters, so it does not support filters in TableScan
1172+
return false;
1173+
}
1174+
}
1175+
1176+
for table_fetch in var_iter!(egraph[subst[table_scan_fetch_var]], TableScanFetch) {
1177+
if table_fetch.is_some() {
1178+
// This rule always inserts limit:None, so it does not support fetch in TableScan
1179+
// TODO support this
1180+
return false;
1181+
}
1182+
}
1183+
11471184
for name in var_iter!(
11481185
egraph[subst[source_table_name_var]],
11491186
TableScanSourceTableName

0 commit comments

Comments
 (0)