Skip to content

Commit e0f0fd2

Browse files
authored
Merge pull request #147 from DataObjects-NET/master-typeid-as-parameter
Constant Type identifiers as parameter of SQL query
2 parents 1610db8 + f1b1788 commit e0f0fd2

File tree

23 files changed

+1005
-189
lines changed

23 files changed

+1005
-189
lines changed

ChangeLog/7.1.0-Beta-2-dev.txt

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
[main] EntitySetChangeRegistry.GetItems() changed result type to improve enumeration
1818
[main] IgnoreRule now has only one public constructor - parameterless
1919
[main] IgnoreRule supports indexes
20+
[main] Queries use parameters instead of constant values for type indentifiers within columns list
21+
[main] Added DomainConfiguration.PreferTypeIdsAsQueryParameters to choose between contants and parameters for TypeIds
2022
[main] BitFaster.Caching package reference is updated to 1.0.7
2123
[main] No error caused by ambiguity due to new IQueryable extension methods of .Net 6
2224
[reprocessing] DomainBuildErrorEventArgs (not sealed) became read-only structure

Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/ServerInfoProvider.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2020 Xtensive LLC.
1+
// Copyright (C) 2011-2021 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Csaba Beer
@@ -179,13 +179,13 @@ public override QueryInfo GetQueryInfo()
179179
queryInfo.MaxQueryParameterCount = DoNotKnow;
180180
queryInfo.Features =
181181
QueryFeatures.NamedParameters |
182-
QueryFeatures.ParameterPrefix |
183-
QueryFeatures.ScalarSubquery |
184-
QueryFeatures.Paging |
185-
QueryFeatures.Limit |
186-
QueryFeatures.Offset |
187-
QueryFeatures.UpdateLimit |
188-
QueryFeatures.DeleteLimit;
182+
QueryFeatures.ParameterPrefix |
183+
QueryFeatures.ScalarSubquery |
184+
QueryFeatures.Paging |
185+
QueryFeatures.Limit |
186+
QueryFeatures.Offset |
187+
QueryFeatures.UpdateLimit |
188+
QueryFeatures.DeleteLimit;
189189
return queryInfo;
190190
}
191191

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/ServiceInfoProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ public override QueryInfo GetQueryInfo()
206206
QueryFeatures.ScalarSubquery |
207207
QueryFeatures.SelfReferencingRowRemovalIsError |
208208
QueryFeatures.StrictJoinSyntax |
209-
QueryFeatures.Batches;
209+
QueryFeatures.Batches |
210+
QueryFeatures.ParameterAsColumn;
210211
return queryInfo;
211212
}
212213

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ public override QueryInfo GetQueryInfo()
192192
QueryFeatures.InsertDefaultValues |
193193
QueryFeatures.UpdateDefaultValues |
194194
QueryFeatures.MultischemaQueries |
195-
QueryFeatures.RowNumber;
195+
QueryFeatures.RowNumber |
196+
QueryFeatures.ParameterAsColumn;
196197
return queryInfo;
197198
}
198199

Orm/Xtensive.Orm.PostgreSql/Orm.Providers.PostgreSql/SqlCompiler.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2020 Xtensive LLC.
1+
// Copyright (C) 2009-2021 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
@@ -22,15 +22,16 @@ protected override SqlProvider VisitFreeText(FreeTextProvider provider)
2222
{
2323
var rankColumnName = provider.Header.Columns[provider.Header.Columns.Count - 1].Name;
2424
var stringTypeMapping = Driver.GetTypeMapping(WellKnownTypes.StringType);
25-
var binding = new QueryParameterBinding(stringTypeMapping,
25+
var searchCriteriaBinding = new QueryParameterBinding(stringTypeMapping,
2626
provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular);
2727

2828
var select = SqlDml.Select();
2929
var realPrimaryIndex = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
3030
var index = realPrimaryIndex.ReflectedType.Indexes.PrimaryIndex;
31-
var query = BuildProviderQuery(index);
31+
var queryAndBindings = BuildProviderQuery(index);
32+
var query = queryAndBindings.Query;
3233
var table = Mapping[realPrimaryIndex.ReflectedType];
33-
var fromTable = SqlDml.FreeTextTable(table, binding.ParameterReference,
34+
var fromTable = SqlDml.FreeTextTable(table, searchCriteriaBinding.ParameterReference,
3435
table.Columns.Select(column => column.Name).Append(rankColumnName).ToArray(table.Columns.Count + 1));
3536
var fromTableRef = SqlDml.QueryRef(fromTable);
3637
foreach (var column in query.Columns) {
@@ -40,16 +41,15 @@ protected override SqlProvider VisitFreeText(FreeTextProvider provider)
4041
select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[rankColumnName], SqlType.Double), rankColumnName);
4142
select.From = fromTableRef;
4243
if (provider.TopN == null) {
43-
return CreateProvider(select, binding, provider);
44+
return CreateProvider(select, queryAndBindings.Bindings.Append(searchCriteriaBinding), provider);
4445
}
4546

4647
var intTypeMapping = Driver.GetTypeMapping(typeof(int));
4748
var topNBinding = new QueryParameterBinding(
4849
intTypeMapping, context => provider.TopN.Invoke(context), QueryParameterBindingType.Regular);
4950
select.Limit = topNBinding.ParameterReference;
5051
select.OrderBy.Add(select.Columns[rankColumnName], false);
51-
return CreateProvider(select, new[] {binding, topNBinding}, provider);
52-
52+
return CreateProvider(select, queryAndBindings.Bindings.Append(topNBinding).Append(searchCriteriaBinding), provider);
5353
}
5454

5555
protected override SqlExpression ProcessAggregate(SqlProvider source, List<SqlExpression> sourceColumns, AggregateColumn aggregateColumn)

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs

+24-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace Xtensive.Sql.Drivers.PostgreSql.v8_0
1313
{
1414
internal class Compiler : SqlCompiler
1515
{
16+
private readonly static Type SqlPlaceholderType = typeof(SqlPlaceholder);
17+
1618
private static readonly SqlNative OneYearInterval = SqlDml.Native("interval '1 year'");
1719
private static readonly SqlNative OneMonthInterval = SqlDml.Native("interval '1 month'");
1820
private static readonly SqlNative OneDayInterval = SqlDml.Native("interval '1 day'");
@@ -31,9 +33,27 @@ public override void Visit(SqlDeclareCursor node)
3133
public override void Visit(SqlBinary node)
3234
{
3335
var right = node.Right as SqlArray;
34-
if (right is not null && (node.NodeType is SqlNodeType.In or SqlNodeType.NotIn)) {
35-
var row = SqlDml.Row(right.GetValues().Select(value => SqlDml.Literal(value)).ToArray());
36-
base.Visit(node.NodeType == SqlNodeType.In ? SqlDml.In(node.Left, row) : SqlDml.NotIn(node.Left, row));
36+
if (right is not null && (node.NodeType==SqlNodeType.In || node.NodeType==SqlNodeType.NotIn)) {
37+
if (right.ItemType == SqlPlaceholderType) {
38+
using (context.EnterScope(node)) {
39+
AppendTranslatedEntry(node);
40+
node.Left.AcceptVisitor(this);
41+
translator.Translate(context.Output, node.NodeType);
42+
_ = context.Output.AppendOpeningPunctuation("(");
43+
var items = right.GetValues();
44+
for (var i = 0; i < items.Length - 1; i++) {
45+
Visit((SqlPlaceholder) items[i]);
46+
_ = context.Output.Append(translator.RowItemDelimiter);
47+
}
48+
Visit((SqlPlaceholder) items[^1]);
49+
_ = context.Output.Append(")");
50+
AppendTranslatedExit(node);
51+
}
52+
}
53+
else {
54+
var row = SqlDml.Row(right.GetValues().Select(value => SqlDml.Literal(value)).ToArray());
55+
base.Visit(node.NodeType == SqlNodeType.In ? SqlDml.In(node.Left, row) : SqlDml.NotIn(node.Left, row));
56+
}
3757
}
3858
else {
3959
switch (node.NodeType) {
@@ -381,4 +401,4 @@ protected internal Compiler(SqlDriver driver)
381401
{
382402
}
383403
}
384-
}
404+
}

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/ServerInfoProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,8 @@ public override QueryInfo GetQueryInfo()
253253
QueryFeatures.InsertDefaultValues |
254254
QueryFeatures.UpdateDefaultValues |
255255
QueryFeatures.MultischemaQueries |
256-
QueryFeatures.ScalarSubquery;
256+
QueryFeatures.ScalarSubquery |
257+
QueryFeatures.ParameterAsColumn;
257258
info.ParameterPrefix = "@";
258259
info.MaxComparisonOperations = 1000000;
259260
info.MaxLength = 1000000;

Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/ServerInfoProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ public override QueryInfo GetQueryInfo()
198198
QueryFeatures.MultischemaQueries |
199199
QueryFeatures.MultidatabaseQueries |
200200
QueryFeatures.ScalarSubquery |
201-
QueryFeatures.PagingRequiresOrderBy;
201+
QueryFeatures.PagingRequiresOrderBy |
202+
QueryFeatures.ParameterAsColumn;
202203
return queryInfo;
203204
}
204205

Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/ServerInfoProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ public override QueryInfo GetQueryInfo()
171171
| QueryFeatures.Offset
172172
| QueryFeatures.InsertDefaultValues
173173
| QueryFeatures.StrictJoinSyntax
174-
| QueryFeatures.ScalarSubquery;
174+
| QueryFeatures.ScalarSubquery
175+
| QueryFeatures.ParameterAsColumn;
175176
return queryInfo;
176177
}
177178

0 commit comments

Comments
 (0)