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