Skip to content

Commit 4ef7325

Browse files
committed
chore(cubesql): Do not rename top level aliases for SQL push down to avoid alias mismatch
1 parent 38467ab commit 4ef7325

File tree

1 file changed

+36
-12
lines changed
  • rust/cubesql/cubesql/src/compile/engine/df

1 file changed

+36
-12
lines changed

rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ impl CubeScanWrapperNode {
146146
transport,
147147
load_request_meta,
148148
self.wrapped_plan.clone(),
149+
false,
149150
)
150151
.await
151152
.and_then(|SqlGenerationResult { data_source, mut sql, .. }| -> result::Result<_, CubeError> {
@@ -174,6 +175,7 @@ impl CubeScanWrapperNode {
174175
transport: Arc<dyn TransportService>,
175176
load_request_meta: Arc<LoadRequestMeta>,
176177
node: Arc<LogicalPlan>,
178+
can_rename_columns: bool,
177179
) -> Pin<Box<dyn Future<Output = result::Result<SqlGenerationResult, CubeError>> + Send>> {
178180
Box::pin(async move {
179181
match node.as_ref() {
@@ -279,6 +281,7 @@ impl CubeScanWrapperNode {
279281
transport.clone(),
280282
load_request_meta.clone(),
281283
from.clone(),
284+
true,
282285
)
283286
.await?;
284287
let mut next_remapping = HashMap::new();
@@ -303,6 +306,7 @@ impl CubeScanWrapperNode {
303306
generator.clone(),
304307
&column_remapping,
305308
&mut next_remapping,
309+
can_rename_columns,
306310
)
307311
.await?;
308312
let (group_by, sql) = Self::generate_column_expr(
@@ -313,6 +317,7 @@ impl CubeScanWrapperNode {
313317
generator.clone(),
314318
&column_remapping,
315319
&mut next_remapping,
320+
can_rename_columns,
316321
)
317322
.await?;
318323
let (aggregate, mut sql) = Self::generate_column_expr(
@@ -323,6 +328,7 @@ impl CubeScanWrapperNode {
323328
generator.clone(),
324329
&column_remapping,
325330
&mut next_remapping,
331+
can_rename_columns,
326332
)
327333
.await?;
328334
let resulting_sql = generator
@@ -387,19 +393,31 @@ impl CubeScanWrapperNode {
387393
generator: Arc<dyn SqlGenerator>,
388394
column_remapping: &Option<HashMap<Column, Column>>,
389395
next_remapping: &mut HashMap<Column, Column>,
396+
can_rename_columns: bool,
390397
) -> result::Result<(Vec<AliasedColumn>, SqlQuery), CubeError> {
391398
let non_id_regex = Regex::new(r"[^a-zA-Z0-9_]")
392399
.map_err(|e| CubeError::internal(format!("Can't parse regex: {}", e)))?;
393400
let mut aliased_columns = Vec::new();
394401
for expr in exprs {
395402
let expr = if let Some(column_remapping) = column_remapping.as_ref() {
396-
replace_col(
397-
expr.clone(),
403+
let original_expr = expr;
404+
let mut expr = replace_col(
405+
original_expr.clone(),
398406
&column_remapping.iter().map(|(k, v)| (k, v)).collect(),
399407
)
400408
.map_err(|_| {
401-
CubeError::internal(format!("Can't rename columns for expr: {:?}", expr))
402-
})?
409+
CubeError::internal(format!(
410+
"Can't rename columns for expr: {:?}",
411+
original_expr
412+
))
413+
})?;
414+
if !can_rename_columns {
415+
let original_alias = expr_name(&original_expr, &schema)?;
416+
if original_alias != expr_name(&expr, &schema)? {
417+
expr = Expr::Alias(Box::new(expr), original_alias.clone());
418+
}
419+
}
420+
expr
403421
} else {
404422
expr
405423
};
@@ -409,15 +427,21 @@ impl CubeScanWrapperNode {
409427
sql = new_sql_query;
410428

411429
let original_alias = expr_name(&expr, &schema)?;
412-
let mut truncated_alias = non_id_regex.replace_all(&original_alias, "_").to_string();
413-
truncated_alias.truncate(16);
414-
let mut alias = truncated_alias.clone();
415-
for i in 1..10000 {
416-
if !next_remapping.contains_key(&Column::from_name(&alias)) {
417-
break;
430+
let alias = if can_rename_columns {
431+
let mut truncated_alias =
432+
non_id_regex.replace_all(&original_alias, "_").to_string();
433+
truncated_alias.truncate(16);
434+
let mut alias = truncated_alias.clone();
435+
for i in 1..10000 {
436+
if !next_remapping.contains_key(&Column::from_name(&alias)) {
437+
break;
438+
}
439+
alias = format!("{}_{}", truncated_alias, i);
418440
}
419-
alias = format!("{}_{}", truncated_alias, i);
420-
}
441+
alias
442+
} else {
443+
original_alias.clone()
444+
};
421445
if original_alias != alias {
422446
if !next_remapping.contains_key(&Column::from_name(&alias)) {
423447
next_remapping.insert(

0 commit comments

Comments
 (0)