Skip to content

Commit 2fa4fd5

Browse files
committed
Inroves JoinViaIn
- uses complete clone of select (prevents aliases reuse in case of multi-key primary key) - uses existing columns instead of creating new ones (prevents incorrect providing of aliases)
1 parent 9fb93f0 commit 2fa4fd5

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

Extensions/Xtensive.Orm.BulkOperations/Internals/QueryOperation.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,22 +136,22 @@ private void JoinWhenQueryHasNoLimitation(SqlStatement statement, SqlSelect sele
136136

137137
private void JoinViaIn(SqlStatement statement, SqlSelect @select)
138138
{
139-
SqlTableRef table = GetStatementTable(statement);
140-
SqlExpression where = GetStatementWhere(statement);
139+
var table = GetStatementTable(statement);
140+
var where = GetStatementWhere(statement);
141141
JoinedTableRef = table;
142-
PrimaryIndexMapping indexMapping = PrimaryIndexes[0];
142+
var indexMapping = PrimaryIndexes[0];
143143
var columns = new List<ColumnInfo>();
144-
foreach (ColumnInfo columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys)
145-
{
146-
SqlSelect s = select.ShallowClone();
147-
foreach (ColumnInfo column in columns)
148-
{
149-
SqlBinary ex = SqlDml.Equals(SqlDml.TableColumn(s.From, column.Name), SqlDml.TableColumn(table, column.Name));
144+
foreach (var columnInfo in indexMapping.PrimaryIndex.KeyColumns.Keys) {
145+
var s = (SqlSelect) select.Clone();
146+
foreach (var column in columns) {
147+
var ex = SqlDml.Equals(s.From.Columns[column.Name], table.Columns[column.Name]);
150148
s.Where = s.Where.IsNullReference() ? ex : SqlDml.And(s.Where, ex);
151149
}
150+
var existingColumns = s.Columns.ToChainedBuffer();
152151
s.Columns.Clear();
153-
s.Columns.Add(SqlDml.TableColumn(s.From, columnInfo.Name));
154-
SqlBinary @in = SqlDml.In(SqlDml.TableColumn(table, columnInfo.Name), s);
152+
var columnToAdd = existingColumns.First(c => c.Name == columnInfo.Name);
153+
s.Columns.Add(columnToAdd);
154+
var @in = SqlDml.In(SqlDml.TableColumn(table, columnInfo.Name), s);
155155
@where = @where.IsNullReference() ? @in : SqlDml.And(@where, @in);
156156
columns.Add(columnInfo);
157157
}

0 commit comments

Comments
 (0)