-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BugFix] Support Generated Column rewrite for logical view with customize column name #52981
base: main
Are you sure you want to change the base?
Conversation
// use scope for view relation to analyze subqueryRelation, clear the pre-analyzed | ||
// information first. | ||
queryRelation.getGeneratedExprToColumnRef().clear(); | ||
visitSubquery((SubqueryRelation) queryRelation, scope); | ||
node.setGeneratedExprToColumnRef(queryRelation.getGeneratedExprToColumnRef()); | ||
} else if (queryRelation instanceof SelectRelation) { | ||
SelectRelation childSelectRelation = (SelectRelation) queryRelation; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The most risky bug in this code is:
Potential ClassCastException
due to unsafe casting.
You can modify the code like this:
// Check instance of expected class before casting
Map<String, String> viewRefAlias = new HashMap<>();
if (scope.getRelationId().getSourceNode() instanceof ViewRelation) {
for (Field f : scope.getRelationFields().getAllFields()) {
if (f.getOriginExpression() instanceof SlotRef) {
viewRefAlias.put(((SlotRef) f.getOriginExpression()).getColumnName(), f.getName());
}
}
}
Map<SlotRef, String> slotRefToAlias = new HashMap<>();
for (SelectListItem item : childSelectRelation.getSelectList().getItems()) {
if (item.isStar()) {
slotRefToAlias.clear();
break;
}
if (!(item.getExpr() instanceof SlotRef)) {
continue;
}
SlotRef exprSlotRef = (SlotRef) item.getExpr();
if (!viewRefAlias.isEmpty()) {
String nameKey = exprSlotRef.getColumnName();
if (viewRefAlias.containsKey(nameKey)) {
slotRefToAlias.put(exprSlotRef, viewRefAlias.get(nameKey));
}
} else if (item.getAlias() != null && !item.getAlias().isEmpty()) {
slotRefToAlias.put(exprSlotRef, item.getAlias());
}
}
This change ensures the cast is safe by storing the result of the cast in a variable and checking before using it further.
…mize column name Why I'm doing: In current implementation, if the logical view sepcify the customize column name which is different from the projection output of the SQL definition, optimizer will not rewrite Generated Column expression although all column have been outputed. This issue is caused by lack of alias information in SelectItem in this case. The alias information can be found in scope for logical view. What I'm doing: 1. Use alias information in scope for logical view rewriting. 2. Refactoring some code. Signed-off-by: srlch <[email protected]>
58b2485
to
e309a54
Compare
Quality Gate passedIssues Measures |
[Java-Extensions Incremental Coverage Report]✅ pass : 0 / 0 (0%) |
[FE Incremental Coverage Report]❌ fail : 15 / 19 (78.95%) file detail
|
[BE Incremental Coverage Report]✅ pass : 0 / 0 (0%) |
Why I'm doing:
In current implementation, if the logical view sepecify the customize column name which is different from the projection output of the SQL definition, optimizer will not rewrite Generated Column expression although all column have been output.
This issue is caused by lack of alias information in SelectItem in this case. The alias information can be found in scope for logical view.
What I'm doing:
Fixes #issue
What type of PR is this:
Does this PR entail a change in behavior?
If yes, please specify the type of change:
Checklist:
Bugfix cherry-pick branch check: