Skip to content

Insert underscore in combined parameter name #1428

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 6, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 44 additions & 3 deletions src/NHibernate.Test/Async/Futures/LinqFutureFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
//------------------------------------------------------------------------------


using System.Collections.Generic;
using NHibernate.Driver;
using NHibernate.Linq;
using NUnit.Framework;
Expand Down Expand Up @@ -205,7 +206,7 @@ public async Task CanUseFutureQueryWithAnonymousTypeAsync()
public async Task CanUseFutureFetchQueryAsync()
{
IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();

using (var s = Sfi.OpenSession())
using (var tx = s.BeginTransaction())
{
Expand Down Expand Up @@ -279,7 +280,7 @@ public async Task TwoFuturesRunInTwoRoundTripsAsync()
public async Task CanCombineSingleFutureValueWithEnumerableFuturesAsync()
{
IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();

using (var s = Sfi.OpenSession())
{
var persons = s.Query<Person>()
Expand Down Expand Up @@ -364,12 +365,52 @@ public async Task CanExecuteMultipleQueriesOnSameExpressionAsync()
var events = logSpy.Appender.GetEvents();
Assert.AreEqual(1, events.Length);
var wholeLog = logSpy.GetWholeLog();
string paramPrefix = ((DriverBase)Sfi.ConnectionProvider.Driver).NamedPrefix;
string paramPrefix = ((DriverBase) Sfi.ConnectionProvider.Driver).NamedPrefix;
Assert.That(
wholeLog,
Does.Contain(paramPrefix + "p0 = 1 [Type: Int32 (0:0:0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0:0:0)]"));
}
}
}

[Test]
public async Task UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisionsAsync()
{
//GH-1357
using (var s = OpenSession())
using (var tx = s.BeginTransaction())
{
var p1 = new Person { Name = "Person name", Age = 15};
var p2 = new Person { Name = "Person name", Age = 5 };

await (s.SaveAsync(p1));
await (s.SaveAsync(p2));
await (tx.CommitAsync());
}
using (var s = Sfi.OpenSession())
{
var list = new List<IFutureEnumerable<Person>>();
for (var i = 0; i < 12; i++)
{
var query = s.Query<Person>();
for (var j = 0; j < 12; j++)
{
query = query.Where(x => x.Age > j);
}
list.Add(query.SetOptions(x => x.SetCacheable(true)).ToFuture());
}
foreach (var query in list)
{
var result = query.ToList();
Assert.That(result.Count,Is.EqualTo(1));
}
}
using (var s = OpenSession())
using (var tx = s.BeginTransaction())
{
await (s.DeleteAsync("from Person"));
await (tx.CommitAsync());
}
}
}
}
33 changes: 33 additions & 0 deletions src/NHibernate.Test/Async/QueryTest/MultiCriteriaFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -441,5 +441,38 @@ public async Task CanGetResultInAGenericListAsync()
Assert.That(results[1], Is.InstanceOf<List<int>>());
}
}

[Test]
public async Task UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisionsAsync()
{
//GH-1357
using (var s = OpenSession())
{
var item = new Item {Id = 15};
await (s.SaveAsync(item));
await (s.FlushAsync());
}

using (var s = OpenSession())
{
var multi = s.CreateMultiCriteria();

for (var i = 0; i < 12; i++)
{
var criteria = s.CreateCriteria(typeof(Item));
for (var j = 0; j < 12; j++)
{
criteria = criteria.Add(Restrictions.Gt("id", j));
}
multi.Add(criteria);
}
//Parameter combining is only used for cacheable queries
multi.SetCacheable(true);
foreach (IList result in await (multi.ListAsync()))
{
Assert.That(result.Count, Is.EqualTo(1));
}
}
}
}
}
49 changes: 45 additions & 4 deletions src/NHibernate.Test/Futures/LinqFutureFixture.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using NHibernate.Driver;
using System.Collections.Generic;
using NHibernate.Driver;
using NHibernate.Linq;
using NUnit.Framework;
using System.Linq;
Expand Down Expand Up @@ -194,7 +195,7 @@ public void CanUseFutureQueryWithAnonymousType()
public void CanUseFutureFetchQuery()
{
IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();

using (var s = Sfi.OpenSession())
using (var tx = s.BeginTransaction())
{
Expand Down Expand Up @@ -268,7 +269,7 @@ public void TwoFuturesRunInTwoRoundTrips()
public void CanCombineSingleFutureValueWithEnumerableFutures()
{
IgnoreThisTestIfMultipleQueriesArentSupportedByDriver();

using (var s = Sfi.OpenSession())
{
var persons = s.Query<Person>()
Expand Down Expand Up @@ -353,12 +354,52 @@ public void CanExecuteMultipleQueriesOnSameExpression()
var events = logSpy.Appender.GetEvents();
Assert.AreEqual(1, events.Length);
var wholeLog = logSpy.GetWholeLog();
string paramPrefix = ((DriverBase)Sfi.ConnectionProvider.Driver).NamedPrefix;
string paramPrefix = ((DriverBase) Sfi.ConnectionProvider.Driver).NamedPrefix;
Assert.That(
wholeLog,
Does.Contain(paramPrefix + "p0 = 1 [Type: Int32 (0:0:0)], " + paramPrefix + "p1 = 2 [Type: Int32 (0:0:0)]"));
}
}
}

[Test]
public void UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisions()
{
//GH-1357
using (var s = OpenSession())
using (var tx = s.BeginTransaction())
{
var p1 = new Person { Name = "Person name", Age = 15};
var p2 = new Person { Name = "Person name", Age = 5 };

s.Save(p1);
s.Save(p2);
tx.Commit();
}
using (var s = Sfi.OpenSession())
{
var list = new List<IFutureEnumerable<Person>>();
for (var i = 0; i < 12; i++)
{
var query = s.Query<Person>();
for (var j = 0; j < 12; j++)
{
query = query.Where(x => x.Age > j);
}
list.Add(query.SetOptions(x => x.SetCacheable(true)).ToFuture());
}
foreach (var query in list)
{
var result = query.ToList();
Assert.That(result.Count,Is.EqualTo(1));
}
}
using (var s = OpenSession())
using (var tx = s.BeginTransaction())
{
s.Delete("from Person");
tx.Commit();
}
}
}
}
33 changes: 33 additions & 0 deletions src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -487,5 +487,38 @@ public void CanGetResultInAGenericList()
Assert.That(results[1], Is.InstanceOf<List<int>>());
}
}

[Test]
public void UsingManyParametersAndQueries_DoesNotCauseParameterNameCollisions()
{
//GH-1357
using (var s = OpenSession())
{
var item = new Item {Id = 15};
s.Save(item);
s.Flush();
}

using (var s = OpenSession())
{
var multi = s.CreateMultiCriteria();

for (var i = 0; i < 12; i++)
{
var criteria = s.CreateCriteria(typeof(Item));
for (var j = 0; j < 12; j++)
{
criteria = criteria.Add(Restrictions.Gt("id", j));
}
multi.Add(criteria);
}
//Parameter combining is only used for cacheable queries
multi.SetCacheable(true);
foreach (IList result in multi.List())
{
Assert.That(result.Count, Is.EqualTo(1));
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/NHibernate/Impl/MultiCriteriaImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ private QueryParameters CreateCombinedQueryParameters()
{
foreach (KeyValuePair<string, TypedValue> dictionaryEntry in queryParameters.NamedParameters)
{
combinedQueryParameters.NamedParameters.Add(dictionaryEntry.Key + index, dictionaryEntry.Value);
combinedQueryParameters.NamedParameters.Add(dictionaryEntry.Key + "_" + index, dictionaryEntry.Value);
}
index += 1;
positionalParameterTypes.AddRange(queryParameters.PositionalParameterTypes);
Expand Down
2 changes: 1 addition & 1 deletion src/NHibernate/Impl/MultiQueryImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,7 @@ private QueryParameters CreateCombinedQueryParameters()
{
foreach (KeyValuePair<string, TypedValue> dictionaryEntry in queryParameters.NamedParameters)
{
combinedQueryParameters.NamedParameters.Add(dictionaryEntry.Key + index, dictionaryEntry.Value);
combinedQueryParameters.NamedParameters.Add(dictionaryEntry.Key + "_" + index, dictionaryEntry.Value);
}
index += 1;
positionalParameterTypes.AddRange(queryParameters.PositionalParameterTypes);
Expand Down