diff --git a/src/NHibernate.Test/DialectTest/DB2DialectFixture.cs b/src/NHibernate.Test/DialectTest/DB2DialectFixture.cs index c0f8679e05f..3fee6c93d12 100644 --- a/src/NHibernate.Test/DialectTest/DB2DialectFixture.cs +++ b/src/NHibernate.Test/DialectTest/DB2DialectFixture.cs @@ -24,11 +24,38 @@ public void GetLimitString() " order by a, x" }); - SqlString limited = dialect.GetLimitString(sql, new SqlString("111"), new SqlString("222")); + SqlString limited = dialect.GetLimitString(sql, new SqlString("111"), new SqlString("222")); Assert.AreEqual( "select * from (select rownumber() over(order by a, x) as rownum, a, b, c from d where X = ? and Z = ? order by a, x) as tempresult where rownum between 111+1 and 222", limited.ToString()); Assert.AreEqual(2, limited.GetParameterCount()); } + + [Test] + public void GetLimitString_NoOffsetSpecified_UsesFetchFirstOnly() + { + // arrange + DB2Dialect dialect = new DB2Dialect(); + SqlString sql = new SqlString( + new object[] + { + "select a, b, c ", + "from d", + " where X = ", + Parameter.Placeholder, + " and Z = ", + Parameter.Placeholder, + " order by a, x" + }); + + // act + SqlString limited = dialect.GetLimitString(sql, null, new SqlString("222")); + + // assert + Assert.AreEqual( + "select a, b, c from d where X = ? and Z = ? order by a, x fetch first 222 rows only", + limited.ToString()); + Assert.AreEqual(2, limited.GetParameterCount()); + } } } \ No newline at end of file diff --git a/src/NHibernate/Dialect/DB2Dialect.cs b/src/NHibernate/Dialect/DB2Dialect.cs index d1df373b785..5dd78d65360 100644 --- a/src/NHibernate/Dialect/DB2Dialect.cs +++ b/src/NHibernate/Dialect/DB2Dialect.cs @@ -208,8 +208,22 @@ public override bool UseMaxForLimit get { return true; } } + /// + public override bool SupportsVariableLimit + { + get { return false; } + } + public override SqlString GetLimitString(SqlString querySqlString, SqlString offset, SqlString limit) { + if (offset == null) + { + return new SqlString(querySqlString, + " fetch first ", + limit, + " rows only"); + } + /* * "select * from (select row_number() over(orderby_clause) as rownum, " * querySqlString_without select @@ -224,7 +238,7 @@ public override SqlString GetLimitString(SqlString querySqlString, SqlString off .Add(querySqlString.Substring(7)) .Add(") as tempresult where rownum "); - if (offset != null && limit != null) + if (limit != null) { pagingBuilder .Add("between ") @@ -232,12 +246,6 @@ public override SqlString GetLimitString(SqlString querySqlString, SqlString off .Add("+1 and ") .Add(limit); } - else if (limit != null) - { - pagingBuilder - .Add("<= ") - .Add(limit); - } else { // We just have an offset.