Skip to content

Commit 8866624

Browse files
committed
Merge branch 'lnu-NH-3495'
2 parents b5e0607 + c79594a commit 8866624

File tree

12 files changed

+160
-5
lines changed

12 files changed

+160
-5
lines changed

doc/reference/modules/basic_mapping.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3167,8 +3167,8 @@
31673167
...
31683168
<database-object>
31693169
<definition class="MyTriggerDefinition"/>
3170-
<dialect-scope name="NHibernate.Dialect.Oracle9Dialect"/>
3171-
<dialect-scope name="NHibernate.Dialect.OracleDialect"/>
3170+
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
3171+
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
31723172
</database-object>
31733173
</hibernate-mapping>]]></programlisting>
31743174
</sect1>

doc/reference/modules/configuration.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,15 +691,20 @@ ISession session = sessions.OpenSession(conn);
691691
<entry></entry>
692692
</row>
693693
<row>
694-
<entry>Oracle 9</entry>
694+
<entry>Oracle 9i</entry>
695695
<entry><literal>NHibernate.Dialect.Oracle9iDialect</literal></entry>
696696
<entry></entry>
697697
</row>
698698
<row>
699-
<entry>Oracle 10g</entry>
699+
<entry>Oracle 10g, Oracle 11g</entry>
700700
<entry><literal>NHibernate.Dialect.Oracle10gDialect</literal></entry>
701701
<entry></entry>
702702
</row>
703+
<row>
704+
<entry>Oracle 12c</entry>
705+
<entry><literal>NHibernate.Dialect.Oracle12cDialect</literal></entry>
706+
<entry></entry>
707+
</row>
703708
<row>
704709
<entry>Sybase Adaptive Server Enterprise 15</entry>
705710
<entry><literal>NHibernate.Dialect.SybaseASE15Dialect</literal></entry>

doc/reference/modules/query_sql.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ IList pusList = query.SetString("name", "Pus%").List(); ]]></programlis
564564
<para>A function must return a result set. The first parameter of
565565
a procedure must be an <literal>OUT</literal> that returns a
566566
result set. This is done by using a
567-
<literal>SYS_REFCURSOR</literal> type in Oracle 9 or 10. In Oracle
567+
<literal>SYS_REFCURSOR</literal> type in Oracle 9i or later. In Oracle
568568
you need to define a <literal>REF CURSOR</literal> type, see
569569
Oracle literature.</para>
570570
</listitem>
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using NHibernate.Dialect;
2+
using NHibernate.SqlCommand;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.DialectTest
6+
{
7+
[TestFixture]
8+
public class oracle12cDialectFixture
9+
{
10+
[Test]
11+
public void GetLimitString()
12+
{
13+
var d = new Oracle12cDialect();
14+
15+
SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c.Rating as Rating2_19_0_, c.Last_Name as Last_Name3_19_0, c.First_Name as First_Name4_19_0 from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), new SqlString("111"), new SqlString("222"));
16+
Assert.AreEqual(
17+
"select distinct c.Contact_Id as Contact1_19_0_, c.Rating as Rating2_19_0_, c.Last_Name as Last_Name3_19_0, c.First_Name as First_Name4_19_0 from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
18+
str.ToString());
19+
20+
str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), new SqlString("111"), new SqlString("222"));
21+
Assert.AreEqual(
22+
"SELECT fish.id FROM fish OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
23+
str.ToString());
24+
25+
str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id FROM fish fish_"), new SqlString("111"), new SqlString("222"));
26+
Assert.AreEqual(
27+
"SELECT DISTINCT fish_.id FROM fish fish_ OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
28+
str.ToString());
29+
30+
str = d.GetLimitString(new SqlString("SELECT DISTINCT fish_.id as ixx9_ FROM fish fish_"), new SqlString("111"), new SqlString("222"));
31+
Assert.AreEqual(
32+
"SELECT DISTINCT fish_.id as ixx9_ FROM fish fish_ OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
33+
str.ToString());
34+
35+
str = d.GetLimitString(new SqlString("SELECT * FROM fish ORDER BY name"), new SqlString("111"), new SqlString("222"));
36+
Assert.AreEqual(
37+
"SELECT * FROM fish ORDER BY name OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
38+
str.ToString());
39+
40+
str = d.GetLimitString(new SqlString("SELECT fish.id, fish.name FROM fish ORDER BY name DESC"), new SqlString("111"), new SqlString("222"));
41+
Assert.AreEqual(
42+
"SELECT fish.id, fish.name FROM fish ORDER BY name DESC OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
43+
str.ToString());
44+
45+
str = d.GetLimitString(new SqlString("SELECT * FROM fish LEFT JOIN (SELECT * FROM meat ORDER BY weight) AS t ORDER BY name DESC"), new SqlString("111"), new SqlString("222"));
46+
Assert.AreEqual(
47+
"SELECT * FROM fish LEFT JOIN (SELECT * FROM meat ORDER BY weight) AS t ORDER BY name DESC OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
48+
str.ToString());
49+
50+
str = d.GetLimitString(new SqlString("SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count FROM fish"), new SqlString("111"), new SqlString("222"));
51+
Assert.AreEqual(
52+
"SELECT *, (SELECT COUNT(1) FROM fowl WHERE fish_id = fish.id) AS some_count FROM fish OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
53+
str.ToString());
54+
55+
str = d.GetLimitString(new SqlString("SELECT * FROM fish WHERE scales = ", Parameter.Placeholder), new SqlString("111"), new SqlString("222"));
56+
Assert.AreEqual(
57+
"SELECT * FROM fish WHERE scales = ? OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
58+
str.ToString());
59+
60+
str = d.GetLimitString(new SqlString("SELECT f.Type, COUNT(DISTINCT f.Name) AS Name FROM Fish f GROUP BY f.Type ORDER BY COUNT(DISTINCT f.Name)"), new SqlString("111"), new SqlString("222"));
61+
Assert.AreEqual(
62+
"SELECT f.Type, COUNT(DISTINCT f.Name) AS Name FROM Fish f GROUP BY f.Type ORDER BY COUNT(DISTINCT f.Name) OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
63+
str.ToString());
64+
}
65+
66+
[Test]
67+
public void GetLimitStringWithInnerOrder()
68+
{
69+
var d = new Oracle12cDialect();
70+
71+
var str = d.GetLimitString(new SqlString("SELECT * FROM A LEFT JOIN (SELECT top 7 * FROM B ORDER BY name) AS B on A.Name = B.Name"), new SqlString("111"), new SqlString("222"));
72+
Assert.AreEqual(
73+
"SELECT * FROM A LEFT JOIN (SELECT top 7 * FROM B ORDER BY name) AS B on A.Name = B.Name OFFSET 111 ROWS FETCH FIRST 222 ROWS ONLY",
74+
str.ToString());
75+
}
76+
77+
[Test]
78+
public void OnlyOffsetLimit()
79+
{
80+
var d = new Oracle12cDialect();
81+
82+
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"), null, new SqlString("10"));
83+
Assert.That(str.ToString(), Is.EqualTo("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 FETCH FIRST 10 ROWS ONLY"));
84+
}
85+
86+
[Test]
87+
public void GetLimitStringWithSqlComments()
88+
{
89+
var d = new Oracle12cDialect();
90+
var limitSqlQuery = d.GetLimitString(new SqlString(" /* criteria query */ SELECT p from lcdtm"), null, new SqlString("2"));
91+
Assert.That(limitSqlQuery, Is.Not.Null);
92+
Assert.That(limitSqlQuery.ToString(), Is.EqualTo(" /* criteria query */ SELECT p from lcdtm FETCH FIRST 2 ROWS ONLY"));
93+
}
94+
}
95+
}

src/NHibernate.Test/GeneratedTest/ComponentOwner.hbm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
3333
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
3434
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
35+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
3536
</database-object>
3637

3738
<database-object>

src/NHibernate.Test/GeneratedTest/GeneratedPropertyEntity.hbm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
3737
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
3838
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
39+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
3940
</database-object>
4041

4142
<database-object>

src/NHibernate.Test/Generatedkeys/ByTrigger/MyEntity.hbm.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
2222
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
2323
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
24+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
2425
</database-object>
2526

2627
<database-object>
@@ -38,6 +39,7 @@
3839
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
3940
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
4041
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
42+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
4143
</database-object>
4244

4345

src/NHibernate.Test/Generatedkeys/Select/MyEntity.hbm.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ DROP TRIGGER my_entity_BI;
4949
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
5050
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
5151
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
52+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
5253
</database-object>
5354

5455
<database-object>
@@ -66,6 +67,7 @@ DROP TRIGGER my_entity_BI;
6667
<dialect-scope name="NHibernate.Dialect.Oracle8iDialect"/>
6768
<dialect-scope name="NHibernate.Dialect.Oracle9iDialect"/>
6869
<dialect-scope name="NHibernate.Dialect.Oracle10gDialect"/>
70+
<dialect-scope name="NHibernate.Dialect.Oracle12cDialect"/>
6971
</database-object>
7072

7173

src/NHibernate.Test/NHibernate.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@
230230
<Compile Include="DialectTest\FunctionTests\SubstringSupportFixture.cs" />
231231
<Compile Include="DialectTest\FunctionTests\SequenceSupportFixture.cs" />
232232
<Compile Include="DialectTest\Ingres9DialectFixture.cs" />
233+
<Compile Include="DialectTest\Oracle12cDialectFixture.cs" />
233234
<Compile Include="DialectTest\MsSql2012DialectFixture.cs" />
234235
<Compile Include="DialectTest\LockHintAppenderFixture.cs" />
235236
<Compile Include="DialectTest\MsSqlCe40DialectFixture.cs" />

src/NHibernate.Test/Pagination/PaginationFixture.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections;
33
using NHibernate.Cfg;
44
using NHibernate.Criterion;
5+
using NHibernate.Dialect;
56
using NUnit.Framework;
67
using Environment=NHibernate.Cfg.Environment;
78

@@ -76,6 +77,10 @@ public void PagTest()
7677
[Test]
7778
public void PagingWithLock_NH2255()
7879
{
80+
if (Dialect is Oracle12cDialect)
81+
Assert.Ignore(@"Oracle does not support row_limiting_clause with for_update_clause
82+
See: https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#BABHFGAA");
83+
7984
using (ISession s = OpenSession())
8085
using (ITransaction t = s.BeginTransaction())
8186
{
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using NHibernate.SqlCommand;
2+
3+
namespace NHibernate.Dialect
4+
{
5+
/// <summary>
6+
/// A dialect specifically for use with Oracle 10g.
7+
/// </summary>
8+
/// <remarks>
9+
/// The main difference between this dialect and <see cref="Oracle12cDialect"/>
10+
/// is the use of "ANSI join syntax" here...
11+
/// </remarks>
12+
public class Oracle12cDialect : Oracle10gDialect
13+
{
14+
/// <summary>
15+
/// Oracle 12c supports a query statement that provides <c>LIMIT</c>
16+
/// functionality with an offset.
17+
/// </summary>
18+
/// <value><c>false</c></value>
19+
public override bool UseMaxForLimit
20+
{
21+
get { return false; }
22+
}
23+
24+
public override SqlString GetLimitString(SqlString querySqlString, SqlString offset, SqlString limit)
25+
{
26+
var result = new SqlStringBuilder(querySqlString);
27+
28+
if (offset != null)
29+
{
30+
result.Add(" OFFSET ");
31+
result.Add(offset).Add(" ROWS");
32+
}
33+
34+
if (limit != null)
35+
{
36+
result.Add(" FETCH FIRST ").Add(limit).Add(" ROWS ONLY");
37+
}
38+
39+
return result.ToSqlString();
40+
}
41+
}
42+
}

src/NHibernate/NHibernate.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
<Compile Include="Dialect\MySQL5InnoDBDialect.cs" />
159159
<Compile Include="Dialect\MySQLDialect.cs" />
160160
<Compile Include="Dialect\BitwiseNativeOperation.cs" />
161+
<Compile Include="Dialect\Oracle12cDialect.cs" />
161162
<Compile Include="Dialect\PostgreSQLDialect.cs" />
162163
<Compile Include="Dialect\Schema\PostgreSQLMetadata.cs" />
163164
<Compile Include="Dialect\Schema\SchemaHelper.cs" />

0 commit comments

Comments
 (0)