From: <fab...@us...> - 2008-07-25 23:55:37
|
Revision: 3672 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3672&view=rev Author: fabiomaulo Date: 2008-07-25 23:55:46 +0000 (Fri, 25 Jul 2008) Log Message: ----------- Fix NH-1413 Note: Thanks to Ciprian Sabolovits for let us know that we are releasing a dialect with more bugs than trunk version, before NH2.0.0RC1; Thanks again. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-07-25 23:37:55 UTC (rev 3671) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-07-25 23:55:46 UTC (rev 3672) @@ -1,15 +1,15 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Text; +using System.Text.RegularExpressions; +using NHibernate.Mapping; +using NHibernate.SqlCommand; +using NHibernate.Util; + namespace NHibernate.Dialect { - using System; - using System.Collections; - using System.Collections.Generic; - using System.Data; - using System.Text.RegularExpressions; - using System.Text; - using Mapping; - using SqlCommand; - using Util; - public class MsSql2005Dialect : MsSql2000Dialect { public MsSql2005Dialect() @@ -66,14 +66,11 @@ sortExpressions = new string[] { "CURRENT_TIMESTAMP" }; } - SqlStringBuilder result = new SqlStringBuilder() - .Add("SELECT TOP ") - .Add(last.ToString()) - .Add(" ") - .Add(StringHelper.Join(", ", columnsOrAliases)) - .Add(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY "); + SqlStringBuilder result = + new SqlStringBuilder().Add("SELECT TOP ").Add(last.ToString()).Add(" ").Add(StringHelper.Join(", ", columnsOrAliases)) + .Add(" FROM (SELECT ROW_NUMBER() OVER(ORDER BY "); - AppendSortExpressions(columnsOrAliases, sortExpressions, result); + AppendSortExpressions(columnsOrAliases, sortExpressions, result); result.Add(") as row, "); @@ -82,44 +79,39 @@ result.Add("query.").Add(columnsOrAliases[i]); bool notLastColumn = i != columnsOrAliases.Count - 1; if (notLastColumn) + { result.Add(", "); + } } for (int i = 0; i < sortExpressions.Length; i++) { string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); - if(!columnsOrAliases.Contains(sortExpression)) + if (!columnsOrAliases.Contains(sortExpression)) { - result.Add(", query.__hibernate_sort_expr_") - .Add(i.ToString()) - .Add("__"); + result.Add(", query.__hibernate_sort_expr_").Add(i.ToString()).Add("__"); } } - result.Add(" FROM (") - .Add(select); + result.Add(" FROM (").Add(select); for (int i = 0; i < sortExpressions.Length; i++) { string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); - if(columnsOrAliases.Contains(sortExpression)) + if (columnsOrAliases.Contains(sortExpression)) + { continue; - + } + if (aliasToColumn.ContainsKey(sortExpression)) + { sortExpression = aliasToColumn[sortExpression]; + } - result.Add(", ") - .Add(sortExpression) - .Add(" as __hibernate_sort_expr_") - .Add(i.ToString()) - .Add("__"); + result.Add(", ").Add(sortExpression).Add(" as __hibernate_sort_expr_").Add(i.ToString()).Add("__"); } - result.Add(" ") - .Add(from) - .Add(") query ) page WHERE page.row > ") - .Add(offset.ToString()) - .Add(" ORDER BY "); + result.Add(" ").Add(from).Add(") query ) page WHERE page.row > ").Add(offset.ToString()).Add(" ORDER BY "); AppendSortExpressions(columnsOrAliases, sortExpressions, result); @@ -132,26 +124,29 @@ return Regex.Replace(sortExpression.Trim(), @"(\)|\s)(?i:asc|desc)$", "$1").Trim(); } - private static void AppendSortExpressions(ICollection<string> columnsOrAliases, string[] sortExpressions, SqlStringBuilder result) + private static void AppendSortExpressions(ICollection<string> columnsOrAliases, string[] sortExpressions, + SqlStringBuilder result) { for (int i = 0; i < sortExpressions.Length; i++) { - if(i > 1) + if (i > 0) + { result.Add(", "); + } string sortExpression = RemoveSortOrderDirection(sortExpressions[i]); - if(columnsOrAliases.Contains(sortExpression)) + if (columnsOrAliases.Contains(sortExpression)) { result.Add(sortExpression); } else { - result.Add("__hibernate_sort_expr_") - .Add(i.ToString()) - .Add("__"); + result.Add("__hibernate_sort_expr_").Add(i.ToString()).Add("__"); } if (sortExpressions[i].Trim().ToLower().EndsWith("desc")) + { result.Add(" DESC"); + } } } @@ -166,9 +161,8 @@ return fromIndex; } - private static void ExtractColumnOrAliasNames(SqlString select, - out List<string> columnsOrAliases, - out Dictionary<string, string> aliasToColumn) + private static void ExtractColumnOrAliasNames(SqlString select, out List<string> columnsOrAliases, + out Dictionary<string, string> aliasToColumn) { columnsOrAliases = new List<string>(); aliasToColumn = new Dictionary<string, string>(); @@ -181,19 +175,26 @@ index += 1; if ("select".Equals(token, StringComparison.InvariantCultureIgnoreCase)) + { continue; + } if ("distinct".Equals(token, StringComparison.InvariantCultureIgnoreCase)) + { continue; + } if ("," == token) + { continue; + } if ("from".Equals(token, StringComparison.InvariantCultureIgnoreCase)) + { break; + } //handle composite expressions like 2 * 4 as foo - while (index < tokens.Count && - "as".Equals(tokens[index], StringComparison.InvariantCultureIgnoreCase) == false && - "," != tokens[index]) + while (index < tokens.Count && "as".Equals(tokens[index], StringComparison.InvariantCultureIgnoreCase) == false + && "," != tokens[index]) { token = token + " " + tokens[index]; index += 1; @@ -208,13 +209,14 @@ { int dot = token.IndexOf('.'); if (dot != -1) + { alias = token.Substring(dot + 1); + } } // notice! we are checking here the existence of "as" "alias", two // tokens from the current one - if (index + 1 < tokens.Count && - "as".Equals(tokens[index], StringComparison.InvariantCultureIgnoreCase)) + if (index + 1 < tokens.Count && "as".Equals(tokens[index], StringComparison.InvariantCultureIgnoreCase)) { alias = tokens[index + 1]; index += 2; //skip the "as" and the alias \ @@ -232,10 +234,7 @@ /// <value><c>true</c></value> public override bool SupportsLimit { - get - { - return true; - } + get { return true; } } /// <summary> @@ -245,23 +244,24 @@ /// <value><c>true</c></value> public override bool SupportsLimitOffset { - get - { - return true; - } + get { return true; } } protected override string GetSelectExistingObject(string name, Table table) { string schema = table.GetQuotedSchemaName(this); - if (schema != null) schema += "."; + if (schema != null) + { + schema += "."; + } string objName = string.Format("{0}{1}", schema, Quote(name)); string parentName = string.Format("{0}{1}", schema, table.GetQuotedName(this)); - return string.Format("select 1 from sys.objects where object_id = OBJECT_ID(N'{0}') AND parent_object_id = OBJECT_ID('{1}')", - objName, parentName); + return + string.Format( + "select 1 from sys.objects where object_id = OBJECT_ID(N'{0}') AND parent_object_id = OBJECT_ID('{1}')", objName, + parentName); } - /// <summary> /// Sql Server 2005 supports a query statement that provides <c>LIMIT</c> /// functionality with an offset. @@ -269,10 +269,7 @@ /// <value><c>false</c></value> public override bool UseMaxForLimit { - get - { - return false; - } + get { return false; } } /// <summary> @@ -376,7 +373,7 @@ currentToken.Length = 0; state = TokenizerState.WhiteSpace; } - else if (ch == ',')// stop current token, and send the , as well + else if (ch == ',') // stop current token, and send the , as well { yield return currentToken.ToString(); currentToken.Length = 0; @@ -404,7 +401,9 @@ } } if (currentToken.Length > 0) + { yield return currentToken.ToString(); + } } public IEnumerator GetEnumerator() @@ -426,4 +425,4 @@ } } } -} +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs (from rev 3671, branches/2.0.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs 2008-07-25 23:55:46 UTC (rev 3672) @@ -0,0 +1,44 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1413 +{ + public class Foo + { + private DateTime birthDate; + private string name; + private long oid; + private int version; + + public Foo() {} + + public Foo(string name, DateTime birthDate) + { + this.name = name; + this.birthDate = birthDate; + } + + public virtual long Oid + { + get { return oid; } + set { oid = value; } + } + + public virtual int Version + { + get { return version; } + set { version = value; } + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual DateTime BirthDate + { + get { return birthDate; } + set { birthDate = value; } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Foo.cs ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml (from rev 3671, branches/2.0.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml 2008-07-25 23:55:46 UTC (rev 3672) @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1413"> + + <class name="Foo" table="XFoos"> + <id name="Oid" column="ID"> + <generator class="identity"/> + </id> + + <version name="Version" column="Version" /> + + <property name="Name" column="Name" type="String(25)" /> + <property name="BirthDate" column="BirthDate" /> + + </class> + +</hibernate-mapping> Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs (from rev 3671, branches/2.0.x/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs 2008-07-25 23:55:46 UTC (rev 3672) @@ -0,0 +1,43 @@ +using System; +using NHibernate.Criterion; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1413 +{ + [TestFixture] + public class PagingTest : BugTestCase + { + [Test] + public void Bug() + { + using(ISession session = OpenSession()) + using(ITransaction t = session.BeginTransaction()) + { + session.Persist(new Foo("Foo1", DateTime.Today.AddDays(5))); + session.Persist(new Foo("Foo2", DateTime.Today.AddDays(1))); + session.Persist(new Foo("Foo3", DateTime.Today.AddDays(3))); + t.Commit(); + } + + DetachedCriteria criteria = DetachedCriteria.For(typeof (Foo)); + criteria.Add(Restrictions.Like("Name", "Foo", MatchMode.Start)); + criteria.AddOrder(Order.Desc("Name")); + criteria.AddOrder(Order.Asc("BirthDate")); + using (ISession session = OpenSession()) + { + ICriteria icriteria = criteria.GetExecutableCriteria(session); + icriteria.SetFirstResult(0); + icriteria.SetMaxResults(2); + Assert.That(2, Is.EqualTo(icriteria.List<Foo>().Count)); + } + + using (ISession session = OpenSession()) + using (ITransaction t = session.BeginTransaction()) + { + session.Delete("from Foo"); + t.Commit(); + } + } + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/PagingTest.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-07-25 23:37:55 UTC (rev 3671) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-07-25 23:55:46 UTC (rev 3672) @@ -413,6 +413,8 @@ <Compile Include="NHSpecificTest\NH1408\DbResourceKey.cs" /> <Compile Include="NHSpecificTest\NH1408\DetachedSubCriteriaTest.cs" /> <Compile Include="NHSpecificTest\NH1408\Entity.cs" /> + <Compile Include="NHSpecificTest\NH1413\Foo.cs" /> + <Compile Include="NHSpecificTest\NH1413\PagingTest.cs" /> <Compile Include="NHSpecificTest\NH280\Fixture.cs" /> <Compile Include="NHSpecificTest\NH280\Foo.cs" /> <Compile Include="NHSpecificTest\NH1018\Employee.cs" /> @@ -1391,6 +1393,7 @@ <EmbeddedResource Include="Any\Person.hbm.xml" /> <EmbeddedResource Include="Any\Properties.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1413\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1304\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1408\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1393\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |