From: <ric...@us...> - 2011-01-22 13:50:37
|
Revision: 5364 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5364&view=rev Author: ricbrown Date: 2011-01-22 13:50:30 +0000 (Sat, 22 Jan 2011) Log Message: ----------- Fix NH-2467 (Futures in 3.0.0.GA not working when using PostgreSQL) - thanks to Artem Tikhomirov for the patch. Also fixes PostgresSQL tests: NHibernate.Test.NHSpecificTest.NH2251.Fixture.EnlistingFirstThePaginationAndThenTheRowCountDoesNotThrows NHibernate.Test.NHSpecificTest.NH2251.Fixture.FuturePagedHql NHibernate.Test.NHSpecificTest.NH2251.Fixture.WhenUseFutureSkipTakeThenNotThrow NHibernate.Test.NHSpecificTest.NH2362.Fixture.CanParseMultipleGroupBy NHibernate.Test.NHSpecificTest.NH2362.Fixture.CanParseMultipleGroupByAndSelect Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/DomainClass.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/NH2467Test.cs Modified: trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2011-01-18 07:02:44 UTC (rev 5363) +++ trunk/nhibernate/src/NHibernate/Engine/QueryParameters.cs 2011-01-22 13:50:30 UTC (rev 5364) @@ -553,12 +553,12 @@ else { paramTypeList.Add(NHibernateUtil.Int32); - limitParameterIndex = totalSpan; + limitParameterIndex = startParameterIndex + totalSpan; if (addOffset) { paramTypeList.Add(NHibernateUtil.Int32); - offsetParameterIndex = totalSpan; - limitParameterIndex = totalSpan + 1; + offsetParameterIndex = startParameterIndex + totalSpan; + limitParameterIndex = startParameterIndex + totalSpan + 1; } } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-01-18 07:02:44 UTC (rev 5363) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2011-01-22 13:50:30 UTC (rev 5364) @@ -5,11 +5,10 @@ using System.Diagnostics; using Iesi.Collections; using Iesi.Collections.Generic; - using NHibernate.Cache; +using NHibernate.Criterion; using NHibernate.Driver; using NHibernate.Engine; -using NHibernate.Criterion; using NHibernate.Loader.Criteria; using NHibernate.SqlCommand; using NHibernate.SqlTypes; @@ -319,18 +318,19 @@ { int limitParameterSpan = BindLimitParametersFirstIfNeccesary(command, queryIndex, colIndex); colIndex = BindQueryParameters(command, queryIndex, colIndex + limitParameterSpan); - BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); + colIndex += BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); } } - private void BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) + private int BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) { QueryParameters parameter = parameters[queryIndex]; RowSelection selection = parameter.RowSelection; if (Loader.Loader.UseLimit(selection, dialect) && !dialect.BindLimitParametersFirst) { - Loader.Loader.BindLimitParameters(command, colIndex, selection, session); + return Loader.Loader.BindLimitParameters(command, colIndex, selection, session); } + return 0; } private int BindQueryParameters(IDbCommand command, int queryIndex, int colIndex) Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-01-18 07:02:44 UTC (rev 5363) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2011-01-22 13:50:30 UTC (rev 5364) @@ -1,9 +1,10 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Data; using System.Diagnostics; using Iesi.Collections; - +using Iesi.Collections.Generic; using NHibernate.Cache; using NHibernate.Driver; using NHibernate.Engine; @@ -12,8 +13,6 @@ using NHibernate.SqlTypes; using NHibernate.Transform; using NHibernate.Type; -using Iesi.Collections.Generic; -using System.Collections.Generic; namespace NHibernate.Impl { @@ -653,18 +652,19 @@ { int limitParameterSpan = BindLimitParametersFirstIfNeccesary(command, queryIndex, colIndex); colIndex = BindQueryParameters(command, queryIndex, colIndex + limitParameterSpan); - BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); + colIndex += BindLimitParametersLastIfNeccesary(command, queryIndex, colIndex); } } - private void BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) + private int BindLimitParametersLastIfNeccesary(IDbCommand command, int queryIndex, int colIndex) { QueryParameters parameter = parameters[queryIndex]; RowSelection selection = parameter.RowSelection; if (Loader.Loader.UseLimit(selection, dialect) && !dialect.BindLimitParametersFirst) { - Loader.Loader.BindLimitParameters(command, colIndex, selection, session); + return Loader.Loader.BindLimitParameters(command, colIndex, selection, session); } + return 0; } private int BindQueryParameters(IDbCommand command, int queryIndex, int colIndex) Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/DomainClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/DomainClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/DomainClass.cs 2011-01-22 13:50:30 UTC (rev 5364) @@ -0,0 +1,20 @@ + + +namespace NHibernate.Test.NHSpecificTest.NH2467 +{ + public class DomainClass + { + + public int Id + { + get; + set; + } + + public string Data + { + get; + set; + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/Mappings.hbm.xml 2011-01-22 13:50:30 UTC (rev 5364) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2467" + default-lazy="false"> + <class name="DomainClass"> + <id name="Id"> + <generator class="assigned" /> + </id> + <property name="Data" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/NH2467Test.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/NH2467Test.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2467/NH2467Test.cs 2011-01-22 13:50:30 UTC (rev 5364) @@ -0,0 +1,126 @@ +using System.Linq; +using NHibernate.Criterion; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2467 +{ + [TestFixture] + public class NH2467Test : BugTestCase + { + protected override void OnSetUp() + { + base.OnSetUp(); + using (var session = OpenSession()) + { + var entity = new DomainClass {Id = 1, Data = "Test"}; + session.Save(entity); + session.Flush(); + } + } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect.SupportsLimit && !dialect.BindLimitParametersFirst; + } + + protected override void OnTearDown() + { + base.OnTearDown(); + using (var session = OpenSession()) + { + session.Delete("from System.Object"); + session.Flush(); + } + } + + [Test] + public void ShouldNotThrowOnFuturePaging() + { + using (var session = OpenSession()) + { + + var contentQuery = session + .CreateCriteria<DomainClass>() + .Add(Restrictions.Eq("Data", "Test")); + contentQuery.SetMaxResults(2); + contentQuery.SetFirstResult(0); + var content = contentQuery.Future<DomainClass>(); + + var countQuery = session + .CreateCriteria<DomainClass>() + .Add(Restrictions.Eq("Data", "Test")); + countQuery.SetProjection(Projections.RowCount()); + var count = countQuery.FutureValue<int>(); + + // triggers batch operation, should not throw + var result = content.ToList(); + } + } + + [Test] + public void ShouldNotThrowOnReversedFuturePaging() + { + using (var session = OpenSession()) + { + + var countQuery = session + .CreateCriteria<DomainClass>() + .Add(Restrictions.Eq("Data", "Test")); + countQuery.SetProjection(Projections.RowCount()); + var count = countQuery.FutureValue<int>(); + + var contentQuery = session + .CreateCriteria<DomainClass>() + .Add(Restrictions.Eq("Data", "Test")); + contentQuery.SetMaxResults(2); + contentQuery.SetFirstResult(0); + var content = contentQuery.Future<DomainClass>(); + + // triggers batch operation, should not throw + var result = content.ToList(); + } + } + + [Test] + public void ShouldNotThrowOnFuturePagingUsingHql() + { + using (var session = OpenSession()) + { + + var contentQuery = session.CreateQuery("from DomainClass as d where d.Data = ?"); + contentQuery.SetString(0, "Test"); + contentQuery.SetMaxResults(2); + contentQuery.SetFirstResult(0); + var content = contentQuery.Future<DomainClass>(); + + var countQuery = session.CreateQuery("select count(d) from DomainClass as d where d.Data = ?"); + countQuery.SetString(0, "Test"); + var count = countQuery.FutureValue<long>(); + + Assert.AreEqual(1, content.ToList().Count); + Assert.AreEqual(1, count.Value); + } + } + + [Test] + public void ShouldNotThrowOnReversedFuturePagingUsingHql() + { + using (var session = OpenSession()) + { + + var contentQuery = session.CreateQuery("from DomainClass as d where d.Data = ?"); + contentQuery.SetString(0, "Test"); + contentQuery.SetMaxResults(2); + contentQuery.SetFirstResult(0); + var content = contentQuery.Future<DomainClass>(); + + var countQuery = session.CreateQuery("select count(d) from DomainClass as d where d.Data = ?"); + countQuery.SetString(0, "Test"); + var count = countQuery.FutureValue<long>(); + + Assert.AreEqual(1, content.ToList().Count); + Assert.AreEqual(1, count.Value); + } + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-01-18 07:02:44 UTC (rev 5363) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-01-22 13:50:30 UTC (rev 5364) @@ -598,6 +598,8 @@ <Compile Include="NHSpecificTest\NH2420\MyTable.cs" /> <Compile Include="NHSpecificTest\NH2441\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2441\Model.cs" /> + <Compile Include="NHSpecificTest\NH2467\DomainClass.cs" /> + <Compile Include="NHSpecificTest\NH2467\NH2467Test.cs" /> <Compile Include="NHSpecificTest\NH2459\Test.cs" /> <Compile Include="NHSpecificTest\NH2459\TrainingComponent.cs" /> <Compile Include="NHSpecificTest\NH2470\Class1Class2Classes.cs" /> @@ -2397,6 +2399,7 @@ <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> + <EmbeddedResource Include="NHSpecificTest\NH2467\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2459\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2412\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2280\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |