From: <fab...@us...> - 2008-11-08 15:24:34
|
Revision: 3897 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3897&view=rev Author: fabiomaulo Date: 2008-11-08 15:24:29 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1550 (by Jaroslav Mart?\195?\161sek) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-11-08 15:14:52 UTC (rev 3896) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-11-08 15:24:29 UTC (rev 3897) @@ -103,6 +103,8 @@ RegisterFunction("upper", new StandardSQLFunction("upper")); RegisterFunction("ascii", new StandardSQLFunction("ascii", NHibernateUtil.Int32)); RegisterFunction("length", new StandardSQLFunction("length", NHibernateUtil.Int64)); + RegisterFunction("left", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1, 1, ?2)")); + RegisterFunction("right", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1, -?2)")); RegisterFunction("to_char", new StandardSQLFunction("to_char", NHibernateUtil.String)); RegisterFunction("to_date", new StandardSQLFunction("to_date", NHibernateUtil.Timestamp)); @@ -189,32 +191,30 @@ get { return true; } } + public override bool SupportsVariableLimit + { + get { return false; } + } + public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) { SqlStringBuilder pagingBuilder = new SqlStringBuilder(); var hasOffset = offset > 0; - if (hasOffset) - { - pagingBuilder.Add("select * from ( select row_.*, rownum rownum_ from ( "); - } - else - { - pagingBuilder.Add("select * from ( "); - } + pagingBuilder.Add("SELECT * FROM ("); pagingBuilder.Add(querySqlString); if (hasOffset) { - pagingBuilder.Add(" ) row_ where rownum <= "); + pagingBuilder.Add(") WHERE rownum BETWEEN "); pagingBuilder.Add(offset.ToString()); - pagingBuilder.Add(" ) where rownum_ > "); + pagingBuilder.Add(" AND "); pagingBuilder.Add((limit + offset).ToString()); } else { - pagingBuilder.Add(" ) where rownum <= "); - pagingBuilder.Add(offset.ToString()); + pagingBuilder.Add(") WHERE rownum <= "); + pagingBuilder.Add(limit.ToString()); } return pagingBuilder.ToSqlString(); Modified: trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs 2008-11-08 15:14:52 UTC (rev 3896) +++ trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs 2008-11-08 15:24:29 UTC (rev 3897) @@ -76,9 +76,17 @@ rset = s.CreateQuery("select abs(round(s.Pay)) from s in class Simple").List(); Assert.AreEqual(46f, rset[0], "abs(round(-45.8)) result was incorrect"); + rset = s.CreateQuery("select left('abc', 2), right('abc', 2) from s in class Simple").List(); + row = (object[]) rset[0]; + Assert.AreEqual("ab", row[0], "Left function is broken."); + Assert.AreEqual("bc", row[1], "Right function is broken."); + // Test a larger depth 3 function example - Not a useful combo other than for testing Assert.AreEqual(1, - s.CreateQuery("select trunc(round(sysdate)) from s in class Simple").List().Count); + s.CreateQuery("select trunc(round(length('A'))) from s in class Simple").List().Count); + // NOTE: In Oracle this will fail as the translator will expect two columns in return + //Assert.AreEqual(1, + // s.CreateQuery("select trunc(round(sysdate)) from s in class Simple").List().Count); // Test the oracle standard NVL funtion as a test of multi-param functions... // NOTE: commented out for NH, since Pay is a value type and will never be null @@ -577,4 +585,4 @@ } } } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |