|
From: <fab...@us...> - 2008-11-17 21:38:37
|
Revision: 3916
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3916&view=rev
Author: fabiomaulo
Date: 2008-11-17 21:34:20 +0000 (Mon, 17 Nov 2008)
Log Message:
-----------
fix NH-1570
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-11-17 20:42:16 UTC (rev 3915)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-11-17 21:34:20 UTC (rev 3916)
@@ -3,7 +3,6 @@
using System.Collections.Generic;
using System.Data;
using System.Text;
-using System.Text.RegularExpressions;
using NHibernate.Mapping;
using NHibernate.SqlCommand;
using NHibernate.Util;
@@ -44,24 +43,24 @@
/// </remarks>
public override SqlString GetLimitString(SqlString querySqlString, int offset, int last)
{
- // we have to do this in order to support parameters in order clause, the foramt
- // that sql 2005 uses for paging means that we move the parameters around, which means,
- // that positions are lost, so we record them before making any changes.
- // NH-1528
- int parameterPositon = 0;
- foreach (var part in querySqlString.Parts)
- {
- Parameter param = part as Parameter;
- if (param == null)
- continue;
- param.OriginalPositionInQuery = parameterPositon;
- parameterPositon += 1;
- }
+ // we have to do this in order to support parameters in order clause, the foramt
+ // that sql 2005 uses for paging means that we move the parameters around, which means,
+ // that positions are lost, so we record them before making any changes.
+ // NH-1528
+ int parameterPositon = 0;
+ foreach (var part in querySqlString.Parts)
+ {
+ Parameter param = part as Parameter;
+ if (param == null)
+ continue;
+ param.OriginalPositionInQuery = parameterPositon;
+ parameterPositon += 1;
+ }
int fromIndex = GetFromIndex(querySqlString);
SqlString select = querySqlString.Substring(0, fromIndex);
- List<SqlString> columnsOrAliases;
- Dictionary<SqlString, SqlString> aliasToColumn;
+ List<SqlString> columnsOrAliases;
+ Dictionary<SqlString, SqlString> aliasToColumn;
ExtractColumnOrAliasNames(select, out columnsOrAliases, out aliasToColumn);
int orderIndex = querySqlString.LastIndexOfCaseInsensitive(" order by ");
@@ -71,13 +70,13 @@
{
from = querySqlString.Substring(fromIndex, orderIndex - fromIndex).Trim();
SqlString orderBy = querySqlString.Substring(orderIndex).Trim();
- sortExpressions = orderBy.Substring(9).Split(",");
+ sortExpressions = orderBy.Substring(9).Split(",");
}
else
{
from = querySqlString.Substring(fromIndex).Trim();
// Use dummy sort to avoid errors
- sortExpressions = new SqlString[] { new SqlString("CURRENT_TIMESTAMP"), };
+ sortExpressions = new[] { new SqlString("CURRENT_TIMESTAMP"), };
}
SqlStringBuilder result =
@@ -99,7 +98,7 @@
}
for (int i = 0; i < sortExpressions.Length; i++)
{
- SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]);
+ SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]);
if (!columnsOrAliases.Contains(sortExpression))
{
result.Add(", query.__hibernate_sort_expr_").Add(i.ToString()).Add("__");
@@ -132,13 +131,14 @@
return result.ToSqlString();
}
- private static SqlString RemoveSortOrderDirection(SqlString sortExpression)
+ private static SqlString RemoveSortOrderDirection(SqlString sortExpression)
{
- if (sortExpression.EndsWithCaseInsensitive("asc"))
- return sortExpression.Substring(0, sortExpression.Length - 3).Trim();
- if (sortExpression.EndsWithCaseInsensitive("desc"))
- return sortExpression.Substring(0, sortExpression.Length - 4).Trim();
- return sortExpression.Trim();
+ SqlString trimmedExpression = sortExpression.Trim();
+ if (trimmedExpression.EndsWithCaseInsensitive("asc"))
+ return trimmedExpression.Substring(0, trimmedExpression.Length - 3).Trim();
+ if (trimmedExpression.EndsWithCaseInsensitive("desc"))
+ return trimmedExpression.Substring(0, trimmedExpression.Length - 4).Trim();
+ return trimmedExpression.Trim();
}
private static void AppendSortExpressions(ICollection<SqlString> columnsOrAliases, SqlString[] sortExpressions,
@@ -167,7 +167,7 @@
}
}
- private int GetFromIndex(SqlString querySqlString)
+ private static int GetFromIndex(SqlString querySqlString)
{
string subselect = querySqlString.GetSubselectString().ToString();
int fromIndex = querySqlString.IndexOfCaseInsensitive(subselect);
@@ -178,11 +178,11 @@
return fromIndex;
}
- private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases,
- out Dictionary<SqlString, SqlString> aliasToColumn)
+ private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases,
+ out Dictionary<SqlString, SqlString> aliasToColumn)
{
- columnsOrAliases = new List<SqlString>();
- aliasToColumn = new Dictionary<SqlString, SqlString>();
+ columnsOrAliases = new List<SqlString>();
+ aliasToColumn = new Dictionary<SqlString, SqlString>();
IList<string> tokens = new QuotedAndParenthesisStringTokenizer(select.ToString()).GetTokens();
int index = 0;
@@ -240,7 +240,7 @@
}
columnsOrAliases.Add(new SqlString(alias));
- aliasToColumn[new SqlString(alias)] = new SqlString(token);
+ aliasToColumn[new SqlString(alias)] = new SqlString(token);
}
}
@@ -442,4 +442,4 @@
}
}
}
-}
\ No newline at end of file
+}
Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2008-11-17 20:42:16 UTC (rev 3915)
+++ trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2008-11-17 21:34:20 UTC (rev 3916)
@@ -15,8 +15,13 @@
{
MsSql2005Dialect d = new MsSql2005Dialect();
- SqlString str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 0, 10);
+ SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), 0, 10);
Assert.AreEqual(
+ "SELECT TOP 10 Contact1_19_0_, Rating2_19_0_ FROM (SELECT ROW_NUMBER() OVER(ORDER BY __hibernate_sort_expr_0__ DESC, __hibernate_sort_expr_1__, __hibernate_sort_expr_2__) as row, query.Contact1_19_0_, query.Rating2_19_0_, query.__hibernate_sort_expr_0__, query.__hibernate_sort_expr_1__, query.__hibernate_sort_expr_2__ FROM (select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_, c.Rating as __hibernate_sort_expr_0__, c.Last_Name as __hibernate_sort_expr_1__, c.First_Name as __hibernate_sort_expr_2__ from dbo.Contact c where COALESCE(c.Rating, 0) > 0) query ) page WHERE page.row > 0 ORDER BY __hibernate_sort_expr_0__ DESC, __hibernate_sort_expr_1__, __hibernate_sort_expr_2__",
+ str.ToString());
+
+ str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 0, 10);
+ Assert.AreEqual(
"SELECT TOP 10 id FROM (SELECT ROW_NUMBER() OVER(ORDER BY __hibernate_sort_expr_0__) as row, query.id, query.__hibernate_sort_expr_0__ FROM (SELECT fish.id, CURRENT_TIMESTAMP as __hibernate_sort_expr_0__ FROM fish) query ) page WHERE page.row > 0 ORDER BY __hibernate_sort_expr_0__",
str.ToString());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|