From a151283518524378201a07d8af8457e96092def2 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 14 Nov 2024 16:40:50 +0500 Subject: [PATCH 1/2] Address bug of modification of immutable TranslatorState Issue appeared after merge from 7.0 Co-authored-by: Sergei Pavlov --- Orm/Xtensive.Orm/Orm/Linq/LocalCollectionKeyTypeExtractor.cs | 4 ++-- Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs | 4 +++- Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Linq/LocalCollectionKeyTypeExtractor.cs b/Orm/Xtensive.Orm/Orm/Linq/LocalCollectionKeyTypeExtractor.cs index db5884c8d2..0afc1c4d4f 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/LocalCollectionKeyTypeExtractor.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/LocalCollectionKeyTypeExtractor.cs @@ -24,14 +24,14 @@ public static Type Extract(BinaryExpression expression) return key.EntityType.UnderlyingType; } - var expr = VisitBinaryExpession(expression); + var expr = VisitBinaryExpression(expression); if (expr.Type.IsSubclassOf(WellKnownOrmTypes.Entity)) { return expr.Type; } throw new NotSupportedException(string.Format(Strings.ExCurrentTypeXIsNotSupported, expr.Type)); } - private static Expression VisitBinaryExpession(BinaryExpression binaryExpression) + private static Expression VisitBinaryExpression(BinaryExpression binaryExpression) { if (!(binaryExpression.Right is MemberExpression memberExpression)) { throw new InvalidOperationException(string.Format(Strings.ExCantConvertXToY, binaryExpression.Type, typeof(MemberExpression))); diff --git a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs index 3128d3e508..d8322aa22a 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs @@ -33,7 +33,9 @@ internal sealed partial class Translator : QueryableVisitor private readonly TranslatorContext context; private readonly bool tagsEnabled; - internal TranslatorState State { get; private set; } = TranslatorState.InitState; + internal TranslatorState State { get; private set; } = new(TranslatorState.InitState) { + NonVisitableExpressions = new() + }; protected override Expression VisitConstant(ConstantExpression c) { diff --git a/Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs b/Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs index 1a83e0248f..0ac6c242e2 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/TranslatorState.cs @@ -70,7 +70,7 @@ public TranslatorScope(Translator translator) /// - /// Expessions that were constructed during original expression translation + /// Expressions that were constructed during original expression translation /// and aim to replace original parts so they are avoidable to visit by Linq translator. /// /// From 35e57b0bc9d5bda4b4c8abac66f8ed9c150c6a01 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 14 Nov 2024 16:47:30 +0500 Subject: [PATCH 2/2] Improve changlog --- ChangeLog/7.1.3_dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog/7.1.3_dev.txt b/ChangeLog/7.1.3_dev.txt index e69de29bb2..ae0d7d4e6e 100644 --- a/ChangeLog/7.1.3_dev.txt +++ b/ChangeLog/7.1.3_dev.txt @@ -0,0 +1 @@ +[main] Addressed race condition issue with TranslatorState.NonVisitableExpressions \ No newline at end of file