diff --git a/src/NHibernate/Dialect/MsSql2005Dialect.cs b/src/NHibernate/Dialect/MsSql2005Dialect.cs index bbba925251f..0bc03aec20c 100644 --- a/src/NHibernate/Dialect/MsSql2005Dialect.cs +++ b/src/NHibernate/Dialect/MsSql2005Dialect.cs @@ -5,6 +5,7 @@ using NHibernate.Mapping; using NHibernate.SqlCommand; using NHibernate.Util; +using NHibernate.Dialect.Function; namespace NHibernate.Dialect { @@ -36,6 +37,13 @@ protected override void RegisterKeywords() RegisterKeyword("xml"); } + protected override void RegisterFunctions() + { + base.RegisterFunctions(); + RegisterFunction("extract", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(?1, ?3)")); + RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "datalength(?1) * 8")); + } + public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit) { var result = new SqlStringBuilder(); @@ -170,7 +178,7 @@ private int GetAfterSelectInsertPoint(SqlString sql) /// the statement to evaluate /// true if the statment contains no parenthesis or an equal number of /// opening and closing parenthesis;otherwise false - private static bool HasMatchingParens(IEnumerable statement) + protected static bool HasMatchingParens(IEnumerable statement) { //unmatched paren count int unmatchedParen = 0; diff --git a/src/NHibernate/Dialect/MsSql2012Dialect.cs b/src/NHibernate/Dialect/MsSql2012Dialect.cs new file mode 100644 index 00000000000..d75508736d3 --- /dev/null +++ b/src/NHibernate/Dialect/MsSql2012Dialect.cs @@ -0,0 +1,38 @@ +using System.Data; +using NHibernate.Cfg; +using NHibernate.Dialect.Function; +using NHibernate.Driver; +using NHibernate.SqlCommand; + +namespace NHibernate.Dialect +{ + public class MsSql2012Dialect : MsSql2008Dialect + { + public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit) + { + var result = new SqlStringBuilder(queryString); + + int orderIndex = queryString.LastIndexOfCaseInsensitive(" order by "); + + //don't use the order index if it is contained within a larger statement(assuming + //a statement with non matching parenthesis is part of a larger block) + if (orderIndex < 0 || !HasMatchingParens(queryString.Substring(orderIndex).ToString())) + { + // Use order by first column if no explicit ordering is provided + result.Add( " ORDER BY ") + .Add("1"); + } + + result.Add(" OFFSET ") + .Add(offset ?? new SqlString("0")) + .Add(" ROWS"); + + if (limit != null) + { + result.Add(" FETCH FIRST ").Add(limit).Add(" ROWS ONLY"); + } + + return result.ToSqlString(); + } + } +} \ No newline at end of file diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index 27cdff47865..4c43c990257 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -134,6 +134,7 @@ +