Conversation
…etween nullable expressions on SQLite SqliteSubqueryToJoinRewriter (dotnet#38692) rewrites `JOIN (SELECT ... WHERE filter) ON key` into `JOIN table ON key AND filter`. It runs at compile time, before SqlNullabilityProcessor, which deliberately leaves a join predicate consisting of a single top-level equality uncompensated because LINQ equijoins don't match null with null. After the fold the equality is nested under an AND, so it gets the regular `a = b OR (a IS NULL AND b IS NULL)` compensation and NULL keys start matching each other, returning extra rows compared to LINQ (and to SQL Server, which doesn't fold). Skip the fold when the join key is a single equality whose two sides can both be null; when at least one side is non-nullable no compensation is generated anyway, so those joins keep being flattened. Adds inner and left join tests with a filtered inner source to NullSemanticsQueryTestBase. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…etween nullable expressions on SQLite
SqliteSubqueryToJoinRewriter (#38692) rewrites
JOIN (SELECT ... WHERE filter) ON keyintoJOIN table ON key AND filter. It runs at compile time, before SqlNullabilityProcessor, which deliberately leaves a join predicate consisting of a single top-level equality uncompensated because LINQ equijoins don't match null with null. After the fold the equality is nested under an AND, so it gets the regulara = b OR (a IS NULL AND b IS NULL)compensation and NULL keys start matching each other, returning extra rows compared to LINQ (and to SQL Server, which doesn't fold).Skip the fold when the join key is a single equality whose two sides can both be null; when at least one side is non-nullable no compensation is generated anyway, so those joins keep being flattened. Adds inner and left join tests with a filtered inner source to NullSemanticsQueryTestBase.