Skip to content

Commit 15e4e4a

Browse files
hazzikoskarb
authored andcommitted
Fix NH-3138 caused by MsSqlSelectParser
1 parent 336fda9 commit 15e4e4a

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

src/NHibernate/Dialect/MsSql2005DialectQueryPager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ private static void BuildFromClauseForPagingQuery(MsSqlSelectParser sqlQuery, Sq
9090
.Add(sqlQuery.SelectClause)
9191
.Add(", ROW_NUMBER() OVER(ORDER BY ");
9292

93-
int orderIndex = 0;
93+
var orderIndex = 0;
9494
foreach (var order in sqlQuery.Orders)
9595
{
9696
if (orderIndex++ > 0) result.Add(", ");
@@ -104,12 +104,12 @@ private static void BuildFromClauseForPagingQuery(MsSqlSelectParser sqlQuery, Sq
104104
}
105105
if (order.IsDescending) result.Add(" DESC");
106106
}
107+
107108
if (orderIndex == 0)
108109
{
109110
result.Add("CURRENT_TIMESTAMP");
110111
}
111112

112-
113113
result.Add(") as __hibernate_sort_row ")
114114
.Add(sqlQuery.FromAndWhereClause)
115115
.Add(") as query");

src/NHibernate/SqlCommand/Parser/MsSqlSelectParser.cs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,15 @@ private ColumnDefinition ParseSelectColumnDefinition(SqlToken beginToken, SqlTok
198198
: alias;
199199

200200
var sqlIndex = beginToken.SqlIndex;
201-
var sqlLength = (endToken != null ? endToken.SqlIndex + endToken.Length : this.Sql.Length) - beginToken.SqlIndex;
201+
var sqlLength = (endToken != null ? endToken.SqlIndex + endToken.Length : Sql.Length) - beginToken.SqlIndex;
202202

203203
return new ColumnDefinition(sqlIndex, sqlLength, name, alias, true);
204204
}
205205

206206
private ColumnDefinition ParseOrderColumnDefinition(SqlToken beginToken, SqlToken endToken, string alias)
207207
{
208208
var sqlIndex = beginToken.SqlIndex;
209-
var sqlLength = (endToken != null ? endToken.SqlIndex + endToken.Length : this.Sql.Length) - beginToken.SqlIndex;
209+
var sqlLength = (endToken != null ? endToken.SqlIndex + endToken.Length : Sql.Length) - beginToken.SqlIndex;
210210

211211
return new ColumnDefinition(sqlIndex, sqlLength, null, alias, false);
212212
}
@@ -271,30 +271,24 @@ private IEnumerable<OrderDefinition> ParseOrderDefinitions(IEnumerator<SqlToken>
271271

272272
private OrderDefinition ParseOrderDefinition(SqlToken beginToken, SqlToken endToken, SqlToken directionToken)
273273
{
274-
ColumnDefinition column;
275-
bool? isDescending = directionToken != null
276-
? directionToken.Equals("desc", StringComparison.InvariantCultureIgnoreCase)
277-
: default(bool?);
274+
var isDescending = directionToken != null &&
275+
directionToken.Equals("desc", StringComparison.InvariantCultureIgnoreCase);
278276

279-
if (beginToken == endToken)
280-
{
281-
string columnNameOrIndex = beginToken.Value;
282-
if (!TryGetColumnDefinition(columnNameOrIndex, out column))
283-
{
284-
// Column appears in order by clause, but not in select clause
285-
column = ParseOrderColumnDefinition(beginToken, endToken, "__c" + _nextOrderAliasIndex++);
286-
}
287-
}
288-
else
289-
{
290-
// Calculated sort order
277+
var columnNameOrIndex = beginToken == endToken
278+
? beginToken.Value
279+
: null;
280+
281+
ColumnDefinition column;
282+
if (!TryGetColumnDefinition(columnNameOrIndex, out column, beginToken, endToken))
283+
{
284+
// Column appears in order by clause, but not in select clause
291285
column = ParseOrderColumnDefinition(beginToken, endToken, "__c" + _nextOrderAliasIndex++);
292286
}
293287

294-
return new OrderDefinition(column, isDescending ?? false);
288+
return new OrderDefinition(column, isDescending);
295289
}
296290

297-
private bool TryGetColumnDefinition(string columnNameOrIndex, out ColumnDefinition result)
291+
private bool TryGetColumnDefinition(string columnNameOrIndex, out ColumnDefinition result, SqlToken beginToken, SqlToken endToken)
298292
{
299293
if (!string.IsNullOrEmpty(columnNameOrIndex))
300294
{
@@ -315,6 +309,22 @@ private bool TryGetColumnDefinition(string columnNameOrIndex, out ColumnDefiniti
315309
}
316310
}
317311
}
312+
else
313+
{
314+
var sqlIndex = beginToken.SqlIndex;
315+
var sqlLength = (endToken != null ? endToken.SqlIndex + endToken.Length : Sql.Length) - beginToken.SqlIndex;
316+
var text = Sql.Substring(sqlIndex, sqlLength).ToString();
317+
foreach (var column in _columns)
318+
{
319+
if (text.Equals(column.Name, StringComparison.InvariantCultureIgnoreCase) ||
320+
text.Equals(column.Alias, StringComparison.InvariantCultureIgnoreCase) ||
321+
text.Equals(Sql.Substring(column.SqlIndex, column.SqlLength).ToString(), StringComparison.InvariantCultureIgnoreCase))
322+
{
323+
result = column;
324+
return true;
325+
}
326+
}
327+
}
318328

319329
result = null;
320330
return false;

0 commit comments

Comments
 (0)