Skip to content

Commit 0bfa63a

Browse files
committed
Do not double alias Exprs
UPSTREAM NOTE: This was attempted to be fixed with apache#15008 but was closed This is the tracking issue on DataFusion: apache#14895 Do not double alias Exprs
1 parent ca465bb commit 0bfa63a

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

datafusion/expr/src/expr.rs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,19 @@ impl Alias {
497497
self.metadata = metadata;
498498
self
499499
}
500+
501+
/// Return true if this alias represents the unaliased `name`
502+
pub fn eq_name(&self, name: &str) -> bool {
503+
self.eq_qualified_name(None, name)
504+
}
505+
506+
pub fn eq_qualified_name(
507+
&self,
508+
relation: Option<&TableReference>,
509+
name: &str,
510+
) -> bool {
511+
self.relation.as_ref() == relation && self.name == name
512+
}
500513
}
501514

502515
/// Binary expression
@@ -1386,7 +1399,14 @@ impl Expr {
13861399

13871400
/// Return `self AS name` alias expression
13881401
pub fn alias(self, name: impl Into<String>) -> Expr {
1389-
Expr::Alias(Alias::new(self, None::<&str>, name.into()))
1402+
// Don't nest aliases
1403+
let Expr::Alias(mut alias) = self else {
1404+
return Expr::Alias(Alias::new(self, None::<&str>, name.into()));
1405+
};
1406+
1407+
alias.relation = None;
1408+
alias.name = name.into();
1409+
Expr::Alias(alias)
13901410
}
13911411

13921412
/// Return `self AS name` alias expression with metadata
@@ -1407,7 +1427,16 @@ impl Expr {
14071427
name: impl Into<String>,
14081428
metadata: Option<std::collections::HashMap<String, String>>,
14091429
) -> Expr {
1410-
Expr::Alias(Alias::new(self, None::<&str>, name.into()).with_metadata(metadata))
1430+
// Don't nest aliases
1431+
let Expr::Alias(mut alias) = self else {
1432+
return Expr::Alias(
1433+
Alias::new(self, None::<&str>, name.into()).with_metadata(metadata),
1434+
);
1435+
};
1436+
1437+
alias.relation = None;
1438+
alias.name = name.into();
1439+
Expr::Alias(alias.with_metadata(metadata))
14111440
}
14121441

14131442
/// Return `self AS name` alias expression with a specific qualifier
@@ -1416,7 +1445,14 @@ impl Expr {
14161445
relation: Option<impl Into<TableReference>>,
14171446
name: impl Into<String>,
14181447
) -> Expr {
1419-
Expr::Alias(Alias::new(self, relation, name.into()))
1448+
// Don't nest aliases
1449+
let Expr::Alias(mut alias) = self else {
1450+
return Expr::Alias(Alias::new(self, relation, name));
1451+
};
1452+
1453+
alias.relation = relation.map(|r| r.into());
1454+
alias.name = name.into();
1455+
Expr::Alias(alias)
14201456
}
14211457

14221458
/// Return `self AS name` alias expression with a specific qualifier and metadata
@@ -1438,7 +1474,14 @@ impl Expr {
14381474
name: impl Into<String>,
14391475
metadata: Option<std::collections::HashMap<String, String>>,
14401476
) -> Expr {
1441-
Expr::Alias(Alias::new(self, relation, name.into()).with_metadata(metadata))
1477+
// Don't nest aliases
1478+
let Expr::Alias(mut alias) = self else {
1479+
return Expr::Alias(Alias::new(self, relation, name).with_metadata(metadata));
1480+
};
1481+
1482+
alias.relation = relation.map(|r| r.into());
1483+
alias.name = name.into();
1484+
Expr::Alias(alias.with_metadata(metadata))
14421485
}
14431486

14441487
/// Remove an alias from an expression if one exists.

0 commit comments

Comments
 (0)