dotnet / dotnet/efcore

Combine length/precision/scale/collation... from both operands in type inference

Open
#32,333 4 comments 0 reactions 0 assignees View on GitHub
area-query customer-reported
Dominant language
C#
Stars
14.8k
Forks
3.4k
PR merge metrics
PR metrics pending

Description

When e.g. a concatenation operation happens over two string operands which have a type mapping (e.g. two columns), the left one is arbitrarily picked; this means that the inferred type mapping for `[p].[ThreeCharacterProperty] + ';' + [p].[FiveCharacterProperty]` will be `char(3)`. This is incorrect and can cause bugs such as https://github.com/dotnet/efcore/issues/32325, where the inferred type mapping is applied to the result of OPENJSON, and therefore incorrectly truncates.

We should improve our type mapping inference logic to take facets into account: in this case we'd add the MaxLength facets together for the resulting MaxLength (3 + 1 = 5 = 9). This requires some thinking since different logic applies e.g. for MaxLength and for Precision/Scale, etc. Also, we need to have logic handilng concatenation with constant/parameter - for the former we can just add the constant's length, but for the latter we'd need to switch to e.g. `nvarchar(max)`.

Note the relationship with #15586, which is about a compatibility chart between different types; this issue is only about proper handling of facets on the same base type.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.