diff --git a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlInsertValuesCollection.cs b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlInsertValuesCollection.cs index e898b2bbe6..33b486af89 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlInsertValuesCollection.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Collections/SqlInsertValuesCollection.cs @@ -123,7 +123,7 @@ internal SqlInsertValuesCollection Clone(SqlNodeCloneContext context) clone.rows = new List(rows.Count); foreach(var oldRow in rows) { - clone.rows.Add((SqlRow) oldRow.Clone()); + clone.rows.Add(oldRow.Clone(context)); } return clone; diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs index 0a33f02feb..0810b3052d 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlConcat.cs @@ -14,19 +14,14 @@ namespace Xtensive.Sql.Dml [Serializable] public class SqlConcat : SqlExpressionList { - internal override SqlConcat Clone(SqlNodeCloneContext context) - { - if (context.NodeMapping.TryGetValue(this, out var value)) { - return (SqlConcat)value; - } - - var expressionsClone = new List(expressions.Count); - foreach (var e in expressions) - expressionsClone.Add(e.Clone(context)); - - var clone = new SqlConcat(expressionsClone); - return clone; - } + internal override SqlConcat Clone(SqlNodeCloneContext context) => + context.GetOrAdd(this, static (t, c) => { + var source = t.expressions; + var expressionsClone = new SqlExpression[source.Count]; + for (int i = 0; i < source.Count; i++) + expressionsClone[i] = source[i].Clone(c); + return new SqlConcat(expressionsClone); + }); public override void ReplaceWith(SqlExpression expression) { diff --git a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs index ccb483b4e9..2983a850f3 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlRow.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using Xtensive.Core; namespace Xtensive.Sql.Dml @@ -12,20 +11,14 @@ namespace Xtensive.Sql.Dml [Serializable] public class SqlRow: SqlExpressionList { - internal override SqlRow Clone(SqlNodeCloneContext context) - { - if (context.TryGet(this) is SqlRow value) { - return value; - } - - var expressionsClone = new List(expressions.Count); - foreach (var e in expressions) - expressionsClone.Add(e.Clone(context)); - - var clone = new SqlRow(expressionsClone); - return clone; - } - + internal override SqlRow Clone(SqlNodeCloneContext context) => + context.GetOrAdd(this, static (t, c) => { + var source = t.expressions; + var expressionsClone = new SqlExpression[source.Count]; + for (int i = 0; i < source.Count; i++) + expressionsClone[i] = source[i].Clone(c); + return new SqlRow(expressionsClone); + }); public override void ReplaceWith(SqlExpression expression) { diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs index 6a151f5038..a292289722 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlForceJoinOrderHint.cs @@ -3,9 +3,7 @@ // See the License.txt file in the project root for more information. using System; -using System.Linq; using System.Collections.Generic; -using Xtensive.Core; namespace Xtensive.Sql.Dml { @@ -20,8 +18,15 @@ public class SqlForceJoinOrderHint : SqlHint public IEnumerable Tables { get { return tables; } } internal override SqlForceJoinOrderHint Clone(SqlNodeCloneContext context) => - context.GetOrAdd(this, static (t, c) => - new SqlForceJoinOrderHint(t.tables?.SelectToArray(table => (SqlTable) table.Clone()))); + context.GetOrAdd(this, static (t, c) => { + if (t.tables is null) + return new SqlForceJoinOrderHint(); + var source = t.tables; + var tablesClone = new SqlTable[source.Length]; + for (int i = 0; i < source.Length; i++) + tablesClone[i] = source[i].Clone(c); + return new SqlForceJoinOrderHint(tablesClone); + }); public override void AcceptVisitor(ISqlVisitor visitor) { diff --git a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs index 5b44d48d6f..c06094321f 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Hints/SqlJoinHint.cs @@ -24,8 +24,7 @@ public class SqlJoinHint : SqlHint public SqlTable Table { get; private set; } internal override SqlJoinHint Clone(SqlNodeCloneContext context) => - context.GetOrAdd(this, static (t, c) => - new SqlJoinHint(t.Method, (SqlTable) t.Table.Clone())); + context.GetOrAdd(this, static (t, c) => new(t.Method, (SqlTable) t.Table.Clone(c))); public override void AcceptVisitor(ISqlVisitor visitor) { diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs index 322b791f62..ea25f2cc7c 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlSelect.cs @@ -204,8 +204,8 @@ internal override SqlSelect Clone(SqlNodeCloneContext context) => foreach (SqlOrder so in t.orderBy) clone.OrderBy.Add(so.Clone(c)); clone.Distinct = t.distinct; - clone.Limit = t.Limit; - clone.Offset = t.Offset; + clone.Limit = t.Limit?.Clone(c); + clone.Offset = t.Offset?.Clone(c); clone.Lock = t.Lock; clone.Comment = t.Comment?.Clone(c); diff --git a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs index 0f306e2b05..16ea2e91ee 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/Statements/SqlUpdate.cs @@ -80,7 +80,7 @@ internal override SqlUpdate Clone(SqlNodeCloneContext context) => if (t.where is not null) clone.Where = t.where.Clone(c); if (t.limit is not null) - clone.Limit = t.where.Clone(c); + clone.Limit = t.limit.Clone(c); if (t.Hints.Count > 0) foreach (SqlHint hint in t.Hints) clone.Hints.Add((SqlHint) hint.Clone(c));