Skip to content
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

Fix to #19295 - Query: optimize CASE blocks #19548

Merged
merged 1 commit into from
Jan 15, 2020
Merged

Fix to #19295 - Query: optimize CASE blocks #19548

merged 1 commit into from
Jan 15, 2020

Conversation

maumar
Copy link
Contributor

@maumar maumar commented Jan 9, 2020

  • if one of the conditions in CaseWhen test evaluates to false we can remove it,
  • if one of the conditions in CaseWhen test evaluates to true, we can remove all blocks (including else block) that appears after,
  • if we only have one CaseWhen block in the end, and test evaluates to true, we can simply return the result,
  • if only Else block is left, return it's result,
  • if nothing is left, return NULL.

Resolves #19295

@roji
Copy link
Member

roji commented Jan 11, 2020

Not very important but I wonder if this belongs in NullabilityBasedSqlProcessingExpressionVisitor - these optimizations don't sound like they're directly related to nullability. Is this where we currently do stuff like eliminate constant true/false that have been left over from previous optimizations?

Just in terms of factoring and to keep NullabilityBasedSqlProcessingExpressionVisitor smaller, it may be better to have a later cleanup phase that would do this kind of thing. The possible downside would be another visitation in RelationalParameterBasedQueryTranslationPostprocessor (after the command cache), but that seems OK to me...

@maumar
Copy link
Contributor Author

maumar commented Jan 15, 2020

@roji this is somewhat unfortunate/confusing naming - we now perform ALL* optimizations in this visitor. This stems from design meeting discussion we had on the topic. I initially named the class simply SqlExpressionOptimizingVisitor (or some such), but @smitpatel wanted class name to be connected to the nullability optimizations, so we came up with NullabilityBasedSqlProcessingExpressionVisitor. I'm open to discussing & changing the name of this visitor once Smit is back.

  • there are some optimizations repeated in the SearchConditionConvertingExpressionVisitor that simplify the product of search condition rewrite, so that we don't need to have a separate optimizing visitor pass after search condition runs.

- if one of the conditions in CaseWhen test evaluates to false we can remove it,
- if one of the conditions in CaseWhen test evaluates to true, we can remove all blocks (including else block) that appears after,
- if we only have one CaseWhen block in the end, and test evaluates to true, we can simply return the result,
- if only Else block is left, return it's result,
- if nothing is left, return NULL.

Resolves #19295
@roji
Copy link
Member

roji commented Jan 15, 2020

@maumar OK, no problem - I don't really mind, this was just about having non-nullability-related optimizations in a visitor named NullabilityBasedSqlProcessingExpressionVisitor. I'd definitely leans towards renaming back to SqlExpressionOptimizingVisitor, but we can always merge and revisit after @smitpatel is back.

@maumar maumar merged commit 194b164 into master Jan 15, 2020
@maumar maumar deleted the fix19295 branch January 15, 2020 21:13
@smitpatel
Copy link
Member

If the optimization is not related to nullability then it should not be put into that visitor. There should be visitor for performing optimization which are independent of nullability of nodes.

@roji
Copy link
Member

roji commented Jan 16, 2020

Somebody seems to have hacked into @smitpatel's account while they are in vacation, but they do seem to know stuff about EF Core ;)

@maumar
Copy link
Contributor Author

maumar commented Jan 16, 2020

@smitpatel we explicitly decided to combine null semantics and general optimizer during the design meeting. Perhaps we can re-visit this once we have more optimizations, but will leave it as is for now.

@smitpatel
Copy link
Member

@maumar - Design meeting decision was to keep them separate explicitly. Optimizations which does not require/depend will remain in separate visitor. I don't have any issue we leave this optimization inside here (which is bit of an abuse) and change it once we have more than one optimization but name of this visitor must reflect the dependency on nullability.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Query: optimize CASE blocks
4 participants