|
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.
|