From ed549372bdb9105d48e53b70c4c5dbc3b0d01d86 Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Tue, 3 Apr 2018 14:34:41 +0200 Subject: [PATCH 01/12] Add support for SAP HANA --- ShowBuildMenu.bat | 13 +- src/NHibernate.Config.Templates/HANA.cfg.xml | 15 + .../Ado/GenericBatchingBatcherFixture.cs | 3 +- .../Ado/GenericBatchingBatcherFixture.cs | 3 +- .../Lambda/FunctionsIntegrationFixture.cs | 6 + .../Criteria/Lambda/IntegrationFixture.cs | 8 +- .../Lambda/ProjectIntegrationFixture.cs | 6 + .../Lambda/SimpleIntegrationFixture.cs | 6 + .../Lambda/SubQueryIntegrationFixture.cs | 6 + .../AbstractCollectionEventFixture.cs | 6 + .../Seqidentity/SequenceIdentityFixture.cs | 4 +- .../Async/GenericTest/Overall/Fixture.cs | 7 +- src/NHibernate.Test/Async/Hql/HQLFunctions.cs | 7 + .../Async/Legacy/FooBarTest.cs | 5 + src/NHibernate.Test/Async/Legacy/FumTest.cs | 8 +- .../Async/Legacy/MasterDetailTest.cs | 5 + .../Async/Legacy/MultiTableTest.cs | 33 +- .../Async/Legacy/ParentChildTest.cs | 5 + .../Async/NHSpecificTest/CollectionFixture.cs | 8 +- .../Docs/Associations/BiM21/Fixture.cs | 8 +- .../Docs/ExampleParentChild/UpdateFixture.cs | 8 +- .../GH1565/LockEntityWithOuterJoinTest.cs | 6 + .../Async/NHSpecificTest/LazyLoadBugTest.cs | 8 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 7 +- .../LoadingNullEntityInSet/Fixture.cs | 7 + .../Async/NHSpecificTest/NH1192/Fixture.cs | 3 +- .../NH1274ExportExcludeFixture.cs | 8 +- .../Async/NHSpecificTest/NH1301/Fixture.cs | 6 + .../Async/NHSpecificTest/NH1388/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH1443/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1601/Fixture1.cs | 36 +- .../Async/NHSpecificTest/NH1601/Fixture2.cs | 36 +- .../Async/NHSpecificTest/NH1609/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH1691/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH1775/Fixture.cs | 3 +- .../Async/NHSpecificTest/NH1869/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH1914/Fixture.cs | 5 + .../Async/NHSpecificTest/NH2328/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH2409/Fixture.cs | 6 + .../Async/NHSpecificTest/NH2703/Fixture.cs | 6 + .../Async/NHSpecificTest/NH2705/Test.cs | 8 +- .../Async/NHSpecificTest/NH3050/Fixture.cs | 6 + .../NHSpecificTest/NH3141/ProxyIdFixture.cs | 6 + .../Async/NHSpecificTest/NH315/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH386/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH440/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH473/Fixture.cs | 6 + .../Async/NHSpecificTest/NH479/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH521/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH607/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH623/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH643/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH687/Fixture.cs | 6 + .../Async/NHSpecificTest/NH704/Fixture.cs | 8 +- .../Async/NHSpecificTest/NH826/Fixture.cs | 8 +- .../NH830/AutoFlushTestFixture.cs | 8 +- .../NHSpecificTest/NH898/NH898Fixture.cs | 7 +- .../Properties/CompositePropertyRefTest.cs | 6 + .../Properties/DynamicEntityTest.cs | 6 + .../SqlConverterAndMultiQuery/Fixture.cs | 6 + .../Async/Operations/MergeFixture.cs | 3 +- .../Stateless/StatelessSessionQueryFixture.cs | 8 +- .../Lambda/FunctionsIntegrationFixture.cs | 6 + .../Criteria/Lambda/IntegrationFixture.cs | 8 +- .../Lambda/ProjectIntegrationFixture.cs | 6 + .../Lambda/SimpleIntegrationFixture.cs | 6 + .../Lambda/SubQueryIntegrationFixture.cs | 6 + .../FunctionTests/SubstringSupportFixture.cs | 2 + .../AbstractCollectionEventFixture.cs | 6 + .../Seqidentity/SequenceIdentityFixture.cs | 4 +- .../GenericTest/Overall/Fixture.cs | 7 +- src/NHibernate.Test/Hql/HQLFunctions.cs | 7 + src/NHibernate.Test/Legacy/FooBarTest.cs | 5 + src/NHibernate.Test/Legacy/FumTest.cs | 8 +- .../Legacy/MasterDetailTest.cs | 5 + src/NHibernate.Test/Legacy/MultiTableTest.cs | 33 +- src/NHibernate.Test/Legacy/ParentChildTest.cs | 5 + .../NHSpecificTest/CollectionFixture.cs | 8 +- .../Docs/Associations/BiM21/Fixture.cs | 8 +- .../Docs/ExampleParentChild/UpdateFixture.cs | 8 +- .../GH1565/LockEntityWithOuterJoinTest.cs | 8 +- .../NHSpecificTest/LazyLoadBugTest.cs | 8 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 7 +- .../LoadingNullEntityInSet/Fixture.cs | 7 + .../NHSpecificTest/NH1192/Fixture.cs | 3 +- .../NH1274ExportExcludeFixture.cs | 8 +- .../NHSpecificTest/NH1301/Fixture.cs | 6 + .../NHSpecificTest/NH1388/Fixture.cs | 8 +- .../NHSpecificTest/NH1443/Fixture.cs | 2 +- .../NHSpecificTest/NH1601/Fixture1.cs | 14 +- .../NHSpecificTest/NH1601/Fixture2.cs | 14 +- .../NHSpecificTest/NH1609/Fixture.cs | 8 +- .../NHSpecificTest/NH1691/Fixture.cs | 8 +- .../NHSpecificTest/NH1775/Fixture.cs | 3 +- .../NHSpecificTest/NH1869/Fixture.cs | 8 +- .../NHSpecificTest/NH1914/Fixture.cs | 5 + .../NHSpecificTest/NH2328/Fixture.cs | 8 +- .../NHSpecificTest/NH2409/Fixture.cs | 6 + .../NHSpecificTest/NH2703/Fixture.cs | 6 + .../NHSpecificTest/NH2705/Test.cs | 8 +- .../NHSpecificTest/NH3050/Fixture.cs | 6 + .../NHSpecificTest/NH3141/ProxyIdFixture.cs | 6 + .../NHSpecificTest/NH315/Fixture.cs | 8 +- .../NHSpecificTest/NH386/Fixture.cs | 8 +- .../NHSpecificTest/NH440/Fixture.cs | 8 +- .../NHSpecificTest/NH473/Fixture.cs | 6 + .../NHSpecificTest/NH479/Fixture.cs | 8 +- .../NHSpecificTest/NH521/Fixture.cs | 8 +- .../NHSpecificTest/NH607/Fixture.cs | 8 +- .../NHSpecificTest/NH623/Fixture.cs | 8 +- .../NHSpecificTest/NH643/Fixture.cs | 8 +- .../NHSpecificTest/NH687/Fixture.cs | 6 + .../NHSpecificTest/NH704/Fixture.cs | 8 +- .../NHSpecificTest/NH826/Fixture.cs | 8 +- .../NH830/AutoFlushTestFixture.cs | 8 +- .../NHSpecificTest/NH898/NH898Fixture.cs | 7 +- .../Properties/CompositePropertyRefTest.cs | 6 + .../Properties/DynamicEntityTest.cs | 6 + .../SqlConverterAndMultiQuery/Fixture.cs | 6 + .../Operations/MergeFixture.cs | 3 +- .../Stateless/StatelessSessionQueryFixture.cs | 8 +- .../TestDialects/AbstractHanaTestDialect.cs | 14 + .../HanaColumnStoreTestDialect.cs | 10 + .../TestDialects/HanaRowStoreTestDialect.cs | 10 + .../TransactionTest/TransactionFixtureBase.cs | 2 +- .../AdoNet/GenericBatchingBatcher.cs | 1 + src/NHibernate/Dialect/AbstractHanaDialect.cs | 1257 +++++++++++++++++ src/NHibernate/Dialect/Dialect.cs | 8 + .../Dialect/Function/SQLFunctionTemplate.cs | 2 +- ...LFunctionTemplateWithRequiredParameters.cs | 40 + .../Dialect/HanaColumnStoreDialect.cs | 48 + src/NHibernate/Dialect/HanaRowStoreDialect.cs | 48 + src/NHibernate/Dialect/Schema/HanaMetaData.cs | 159 +++ src/NHibernate/Driver/HanaDriver.cs | 81 ++ src/NHibernate/Mapping/Table.cs | 1 + 135 files changed, 2480 insertions(+), 137 deletions(-) create mode 100644 src/NHibernate.Config.Templates/HANA.cfg.xml create mode 100644 src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs create mode 100644 src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs create mode 100644 src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs create mode 100644 src/NHibernate/Dialect/AbstractHanaDialect.cs create mode 100644 src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs create mode 100644 src/NHibernate/Dialect/HanaColumnStoreDialect.cs create mode 100644 src/NHibernate/Dialect/HanaRowStoreDialect.cs create mode 100644 src/NHibernate/Dialect/Schema/HanaMetaData.cs create mode 100644 src/NHibernate/Driver/HanaDriver.cs diff --git a/ShowBuildMenu.bat b/ShowBuildMenu.bat index dfa71036ecf..2e7d4e10380 100644 --- a/ShowBuildMenu.bat +++ b/ShowBuildMenu.bat @@ -51,12 +51,14 @@ echo E. Add a test configuration for Oracle. echo F. Add a test configuration for Oracle with managed driver. echo G. Add a test configuration for SQL Server Compact. echo H. Add a test configuration for MySql. +echo I. Add a test configuration for SAP HANA. echo. echo X. Exit to main menu. echo. -%BUILDTOOL% prompt ABCDEFGHX -if errorlevel 8 goto main-menu +%BUILDTOOL% prompt ABCDEFGHIX +if errorlevel 9 goto main-menu +if errorlevel 8 goto test-setup-hana if errorlevel 7 goto test-setup-mysql if errorlevel 6 goto test-setup-sqlserverce if errorlevel 5 goto test-setup-oracle-managed @@ -122,6 +124,13 @@ set LIB_FILES= set LIB_FILES2= goto test-setup-generic +:test-setup-hana +set CONFIG_NAME=HANA +set TEST_PLATFORM=AnyCPU +set LIB_FILES= +set LIB_FILES2= +goto test-setup-generic + :test-setup-generic set CFGNAME= set /p CFGNAME=Enter a name for your test configuration or press enter to use default name: diff --git a/src/NHibernate.Config.Templates/HANA.cfg.xml b/src/NHibernate.Config.Templates/HANA.cfg.xml new file mode 100644 index 00000000000..1efeab70083 --- /dev/null +++ b/src/NHibernate.Config.Templates/HANA.cfg.xml @@ -0,0 +1,15 @@ + + + + + NHibernate.Driver.HanaDriver + + Server=localhost:39015;UserID=nhibernate;Password= + + NHibernate.Dialect.HanaColumnStoreDialect + + diff --git a/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs b/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs index a8b66b34f7e..9888fe700a2 100644 --- a/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs +++ b/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs @@ -28,7 +28,8 @@ protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is FirebirdDialect) && !(dialect is Oracle8iDialect) && - !(dialect is MsSqlCeDialect); + !(dialect is MsSqlCeDialect) && + !(dialect is AbstractHanaDialect); } [Test] diff --git a/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs b/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs index 8392263894f..995fbaaf3af 100644 --- a/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs +++ b/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs @@ -41,7 +41,8 @@ protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is FirebirdDialect) && !(dialect is Oracle8iDialect) && - !(dialect is MsSqlCeDialect); + !(dialect is MsSqlCeDialect) && + !(dialect is AbstractHanaDialect); } [Test] diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs index 0b1cc1609ab..c4d2937588c 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -11,6 +11,7 @@ using System; using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -19,6 +20,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class FunctionsIntegrationFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly => "NHibernate.Test"; protected override IList Mappings => new[] { "Criteria.Lambda.Mappings.hbm.xml" }; diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs index 5e6e76b5884..8de80b4e062 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs @@ -16,6 +16,7 @@ using NUnit.Framework; using NHibernate.Criterion; +using NHibernate.Dialect; namespace NHibernate.Test.Criteria.Lambda { @@ -24,6 +25,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class IntegrationFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } } protected override IList Mappings @@ -455,4 +461,4 @@ public async Task StatelessSessionAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs index dc73994e402..31d784ad5be 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -11,6 +11,7 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Transform; using NUnit.Framework; @@ -20,6 +21,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class ProjectIntegrationFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs index 79de02dd0ca..575ed161994 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -9,6 +9,7 @@ using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -17,6 +18,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SimpleIntegrationFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs index 598072d78ca..873beed79ff 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -11,6 +11,7 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -19,6 +20,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SubQueryIntegrationFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs index d5c4a55210b..f6c654be8d4 100644 --- a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs @@ -13,6 +13,7 @@ using NHibernate.Collection; using NHibernate.Collection.Generic; using NHibernate.Event; +using NHibernate.Dialect; using NHibernate.Test.Events.Collections.Association.Bidirectional.ManyToMany; using NUnit.Framework; @@ -23,6 +24,11 @@ namespace NHibernate.Test.Events.Collections [TestFixture] public abstract class AbstractCollectionEventFixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index e753de8f0f7..9c6e83b3963 100644 --- a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -29,7 +29,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect); + return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.AbstractHanaDialect); } [Test] @@ -49,4 +49,4 @@ public async Task SequenceIdentityGeneratorAsync() session.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs index 9c6cbd4816d..e73b81220dc 100644 --- a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs @@ -11,7 +11,7 @@ using System; using System.Collections; using System.Collections.Generic; - +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -20,6 +20,11 @@ namespace NHibernate.Test.GenericTest.Overall [TestFixture] public class FixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get { return new[] { "GenericTest.Overall.Mappings.hbm.xml" }; } diff --git a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs index c7212067625..0cb7675ce82 100644 --- a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs @@ -947,6 +947,13 @@ public async Task CastAsync() throw; } } + else if (Dialect is AbstractHanaDialect) + { + string msgToCheck = + "not a GROUP BY expression: 'ANIMAL0_.BODYWEIGHT' must be in group by clause"; + if (!ex.InnerException.Message.Contains(msgToCheck)) + throw; + } else { string msgToCheck = diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index d148a732bf6..efe528993f8 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -42,6 +42,11 @@ private static byte[] GetBytes(string str) return Encoding.Unicode.GetBytes(str); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/Async/Legacy/FumTest.cs b/src/NHibernate.Test/Async/Legacy/FumTest.cs index 779c374d42d..67ed75ccf75 100644 --- a/src/NHibernate.Test/Async/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FumTest.cs @@ -15,6 +15,7 @@ using System.Runtime.Serialization.Formatters.Binary; using NHibernate.DomainModel; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Type; using NUnit.Framework; @@ -29,6 +30,11 @@ public class FumTestAsync : TestCase { protected static short fumKeyShort = 1; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get @@ -727,4 +733,4 @@ private ISession SpoofSerialization(ISession session) return (ISession) formatter.Deserialize(stream); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs index 3639e821c88..df2b4203b7b 100644 --- a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs @@ -30,6 +30,11 @@ namespace NHibernate.Test.Legacy [TestFixture] public class MasterDetailTestAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs index 0a2abcd1882..cfd571e92d1 100644 --- a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs @@ -148,7 +148,7 @@ public async Task QueriesAsync() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = (long) await (s.SaveAsync(new TrivialClass())); } @@ -184,7 +184,7 @@ public async Task ConstraintsAsync() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { await (s.SaveAsync(sm)); } @@ -205,6 +205,11 @@ public async Task ConstraintsAsync() [Test] public async Task MultiTableAsync() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -215,7 +220,7 @@ public async Task MultiTableAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -230,7 +235,7 @@ public async Task MultiTableAsync() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { smid = await (s.SaveAsync(sm)); } @@ -340,6 +345,11 @@ public async Task MultiTableAsync() [Test] public async Task MultiTableGeneratedIdAsync() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -464,7 +474,7 @@ public async Task MultiTableCollectionsAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -484,7 +494,7 @@ public async Task MultiTableCollectionsAsync() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = await (s.SaveAsync(ls)); } @@ -541,7 +551,7 @@ public async Task MultiTableManyToOneAsync() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = await (s.SaveAsync(multi)); } @@ -556,7 +566,7 @@ public async Task MultiTableManyToOneAsync() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = await (s.SaveAsync(ls)); } @@ -602,6 +612,11 @@ public async Task MultiTableNativeIdAsync() [Test] public async Task CollectionAsync() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("HANA does not support inserting a row without specifying any column values"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi1 = new Multi(); @@ -701,4 +716,4 @@ public async Task DynamicUpdateAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs index 543391b7136..a0477f34e7b 100644 --- a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs @@ -24,6 +24,11 @@ namespace NHibernate.Test.Legacy [TestFixture] public class ParentChildTestAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs index 53b47cad6c5..40b99e2800e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -36,6 +37,11 @@ protected override void OnTearDown() } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestLoadParentFirstAsync() { @@ -96,4 +102,4 @@ public async Task TestLoadChildFirstAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index bd04b885705..d4f9e977903 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.Associations.BiM21 @@ -28,6 +29,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.Docs.Associations.BiM21.Mappings.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestCorrectUseAsync() { @@ -73,4 +79,4 @@ public void TestErrorUsageAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index 03b397df003..0da54d38115 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.ExampleParentChild @@ -28,6 +29,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.Docs.ExampleParentChild.Mappings.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task UpdateAsync() { @@ -64,4 +70,4 @@ public async Task UpdateAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index 56e189e798f..5a5b77f55f1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.GH1565 @@ -55,5 +56,10 @@ protected override void OnTearDown() session.CreateSQLQuery("delete from MainEntity").ExecuteUpdate(); } } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } } } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs index 4c92593e0bf..8be9ec6c8ef 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -24,6 +25,11 @@ protected override IList Mappings get { return new string[] {"NHSpecific.LazyLoadBug.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestLazyLoadAsync() { @@ -102,4 +108,4 @@ public async Task TestLazyLoadNoAddAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs index a1d00969f4a..55a8b07ffd3 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -14,6 +14,7 @@ using log4net.Appender; using log4net.Core; using log4net.Repository.Hierarchy; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.ListsWithHoles @@ -24,8 +25,12 @@ namespace NHibernate.Test.NHSpecificTest.ListsWithHoles [TestFixture] public class FixtureAsync : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } - protected override IList Mappings + protected override IList Mappings { get { return new string[] { "NHSpecificTest.ListsWithHoles.Mappings.hbm.xml" }; } } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index caf304b69ec..06055988d00 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -8,6 +8,8 @@ //------------------------------------------------------------------------------ +using NHibernate.Dialect; + namespace NHibernate.Test.NHSpecificTest.LoadingNullEntityInSet { using System.Collections; @@ -32,6 +34,11 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override DebugSessionFactory BuildSessionFactory() { cfg.GetCollectionMapping(typeof (Employee).FullName + ".Primaries") diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs index 84a4c2c6398..63f37734afa 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs @@ -19,7 +19,8 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect); + return !(dialect is Oracle8iDialect) && + !(dialect is AbstractHanaDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs index 66480289864..bb8093267c8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs @@ -69,8 +69,8 @@ public async Task SchemaExport_Export_CreatesExportScriptAsync() Assert.IsTrue(s.Contains("drop table Home_All")); } - Assert.IsTrue(s.Contains("create table Home_All")); - Assert.IsTrue(s.Contains("create table Home_Export")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_All")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_Export")); } [Test] @@ -82,8 +82,8 @@ public async Task SchemaExport_Update_CreatesUpdateScriptAsync() await (update.ExecuteAsync(tw.WriteLine, false)); string s = tw.ToString(); - Assert.IsTrue(s.Contains("create table Home_Update")); - Assert.IsTrue(s.Contains("create table Home_All")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_Update")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_All")); } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs index 32e7d3b1d68..64dc5c76bd3 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1301 @@ -21,6 +22,11 @@ public override string BugNumber get { return "NH1301"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs index 73bea822439..580c7d2c535 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1388 @@ -18,6 +19,11 @@ namespace NHibernate.Test.NHSpecificTest.NH1388 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task BagTestAsync() { @@ -110,4 +116,4 @@ protected override string CacheConcurrencyStrategy get { return null; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1443/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1443/Fixture.cs index ff1267b5d3a..39b677047e1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1443/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1443/Fixture.cs @@ -33,7 +33,7 @@ public class FixtureAsync else Assert.That(script, Does.Match("drop table nhibernate.dbo.Aclass")); - Assert.That(script, Does.Match("create table nhibernate.dbo.Aclass")); + Assert.That(script, Does.Match("create ((column|row) )?table nhibernate.dbo.Aclass")); } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs index 06fe6fbf288..16235977fb5 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -18,22 +19,27 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture1Async : BugTestCase { - /// - /// Loads the project do not call Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + + /// + /// Loads the project do not call Count on the list assigned. + /// + [Test] public Task TestSaveAndLoadWithoutCountAsync() - { - try - { - ProjectWithOneList.TestAccessToList = false; - return SaveAndLoadProjectWithOneListAsync(); - } - catch (System.Exception ex) - { - return Task.FromException(ex); - } - } + { + try + { + ProjectWithOneList.TestAccessToList = false; + return SaveAndLoadProjectWithOneListAsync(); + } + catch (System.Exception ex) + { + return Task.FromException(ex); + } + } /// /// Refreshes the project do not call Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs index 9eae4b87fc6..aa7dbb075d8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -18,22 +19,27 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture2Async : BugTestCase { - /// - /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + + /// + /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. + /// + [Test] public Task TestSaveAndLoadWithTwoCountsAsync() - { - try - { - Project.TestAccessToList = false; - return SaveAndLoadProjectAsync(); - } - catch (System.Exception ex) - { - return Task.FromException(ex); - } - } + { + try + { + Project.TestAccessToList = false; + return SaveAndLoadProjectAsync(); + } + catch (System.Exception ex) + { + return Task.FromException(ex); + } + } /// /// Refreshes the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs index 403b3d74483..0a4343d4a28 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs @@ -10,6 +10,7 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; @@ -25,6 +26,11 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestAsync() { @@ -83,4 +89,4 @@ public async Task TestAsync() return b; } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs index dae60e7b972..6cf0b96aa51 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1691 @@ -17,6 +18,11 @@ namespace NHibernate.Test.NHSpecificTest.NH1691 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private static Component GetInitializedComponent() { var component = new Component(); @@ -123,4 +129,4 @@ public async Task NestedComponentCollectionAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs index b0a6bdf6017..4af86b32fc8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs @@ -20,7 +20,8 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect); + return !(dialect is Oracle8iDialect) && + !(dialect is AbstractHanaDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs index bed8bab3850..579c2c9672b 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs @@ -9,6 +9,7 @@ using System.Collections; +using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; @@ -26,6 +27,11 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnTearDown() { using (var session = Sfi.OpenSession()) @@ -83,4 +89,4 @@ public async Task TestAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs index 053ba28dd26..f630adf5985 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1914 @@ -18,6 +19,10 @@ namespace NHibernate.Test.NHSpecificTest.NH1914 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } [Test] public async Task CascadeInsertAssignedAsync() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs index a0b90579258..97db600f260 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs @@ -9,6 +9,7 @@ using System.Linq; +using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -18,6 +19,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2328 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { base.OnSetUp(); @@ -109,4 +115,4 @@ public async Task AnyIs_HqlWorksWithClassNameInTheLeftAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs index 3c2b8f2e190..c27db3165c6 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs @@ -11,6 +11,7 @@ using System; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.SqlCommand; using NUnit.Framework; @@ -20,6 +21,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2409 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task BugAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs index 011d0b4c6ec..6e0ae5e2849 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2703 @@ -18,6 +19,11 @@ public class FixtureAsync : BugTestCase { Parent RootElement = null; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using (ISession session = Sfi.OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs index 6159e3b0515..313d86ed0f7 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; +using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -31,6 +32,11 @@ public class TestAsync : BugTestCase .Where(p => p.SubItem.Name == name).ToListAsync(cancellationToken)); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Fetch_OnComponent_ShouldNotThrowAsync() { @@ -94,4 +100,4 @@ public void LinqQueryWithFetch_WhenDerivedClassesUseComponentAndEagerFetchManyTo } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs index c8aedc6450f..6ef1f06db8a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs @@ -21,12 +21,18 @@ using NUnit.Framework; using System.Linq; +using NHibernate.Dialect; namespace NHibernate.Test.NHSpecificTest.NH3050 { [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs index 122f3a27e82..b401a2db5eb 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -10,6 +10,7 @@ using System; using System.Diagnostics; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3141 @@ -21,6 +22,11 @@ public class ProxyIdFixtureAsync : BugTestCase { private int id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs index a4b7caf3376..0ce67cdbbb3 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH315 @@ -25,6 +26,11 @@ public override string BugNumber get { return "NH315"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task SaveClientAsync() { @@ -54,4 +60,4 @@ public async Task SaveClientAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs index 5c40c9f04c6..19d7b2089a7 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -22,6 +23,11 @@ public override string BugNumber get { return "NH386"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task QueryAsync() { @@ -32,4 +38,4 @@ public async Task QueryAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs index 105576c0948..ba684296227 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH440 @@ -32,6 +33,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.NH440.Fruit.hbm.xml", "NHSpecificTest.NH440.Apple.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { @@ -150,4 +156,4 @@ public async Task StoreWithLinksAndLookupWithQueryFromFruitAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs index de8d562a02e..f13b5a3ab3a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Text; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH473 @@ -19,6 +20,11 @@ namespace NHibernate.Test.NHSpecificTest.NH473 [TestFixture] public class FixtureAsync:BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using(var session=this.OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs index 444737bc6b8..8249795a597 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH479 @@ -22,6 +23,11 @@ public override string BugNumber get { return "NH479"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task MergeTestAsync() { @@ -57,4 +63,4 @@ public async Task MergeTestAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs index 37f17159a17..6814a3293ad 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH521 @@ -21,6 +22,11 @@ public override string BugNumber get { return "NH521"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task AttachUninitProxyCausesInitAsync() { @@ -68,4 +74,4 @@ public async Task AttachUninitProxyCausesInitAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs index ea368b7749b..bfa3789376f 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH607 @@ -22,6 +23,11 @@ public override string BugNumber get { return "NH607"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task TestAsync() { @@ -54,4 +60,4 @@ public async Task TestAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs index 1bf9b24000e..6f0c2cb13f2 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH623 @@ -23,6 +24,11 @@ public override string BugNumber get { return "NH623"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean + } + private ISession session; private ITransaction tran; @@ -82,4 +88,4 @@ public async Task WhereAttributesOnBagsAsync() Assert.AreEqual(1, d.Pages.Count); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs index 89165be75f2..35010691d2c 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH643 @@ -23,6 +24,11 @@ public override string BugNumber get { return "NH643"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private object parentId; [Test] @@ -84,4 +90,4 @@ public async Task CacheAndLazyCollectionsAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs index 23395ae2d78..3cd0c7a0763 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH687 @@ -22,6 +23,11 @@ public override string BugNumber get { return "NH687"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task GetQueryTestAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs index 7b9a60e7115..b7683531478 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs @@ -9,6 +9,7 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH704 @@ -22,6 +23,11 @@ public override string BugNumber get { return "NH704"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task ReAttachCatTestAsync() { @@ -46,4 +52,4 @@ public async Task ReAttachCatTestAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs index 9670b8e1e80..c2b34307b05 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs @@ -9,6 +9,7 @@ using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH826 @@ -17,6 +18,11 @@ namespace NHibernate.Test.NHSpecificTest.NH826 [TestFixture] public class FixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task BugAsync() { @@ -59,4 +65,4 @@ public async Task BugAsync() session.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs index afa5931b2f2..805c3515fa9 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -10,6 +10,7 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH830 @@ -18,6 +19,11 @@ namespace NHibernate.Test.NHSpecificTest.NH830 [TestFixture] public class AutoFlushTestFixtureAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task AutoFlushTestAsync() { @@ -50,4 +56,4 @@ public async Task AutoFlushTestAsync() sess.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs index 0b385e8f0ea..811ee864d15 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs @@ -10,7 +10,7 @@ using System; using System.Collections; - +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH898 @@ -33,6 +33,11 @@ protected override IList Mappings } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public async Task BugAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs index 35d73040c17..953ba87799b 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -10,6 +10,7 @@ using System; using System.Linq; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -21,6 +22,11 @@ public class CompositePropertyRefTestAsync : BugTestCase private long p_id; private long p2_id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs index 90fa8b3a468..e0032c363dc 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -10,6 +10,7 @@ using System.Collections; using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -18,6 +19,11 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTestAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index fc8c339848e..87892eec3e0 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -9,6 +9,7 @@ using NHibernate.Cfg; +using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; using NUnit.Framework; @@ -35,6 +36,11 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver is SqlClientDriver; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void NormalHqlShouldThrowUserExceptionAsync() { diff --git a/src/NHibernate.Test/Async/Operations/MergeFixture.cs b/src/NHibernate.Test/Async/Operations/MergeFixture.cs index f8864afcde5..cc2b585030d 100644 --- a/src/NHibernate.Test/Async/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Async/Operations/MergeFixture.cs @@ -22,7 +22,8 @@ public class MergeFixtureAsync : AbstractOperationTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Dialect.FirebirdDialect); // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture + return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture + !(dialect is Dialect.AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs index 817c41bc38e..74c57940fd5 100644 --- a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs @@ -10,6 +10,7 @@ using System.Collections; using NHibernate.Cfg; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Stateless @@ -35,6 +36,11 @@ protected override void Configure(Configuration configuration) cfg.SetProperty(Environment.MaxFetchDepth, 1.ToString()); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private class TestData { internal readonly IList list = new ArrayList(); @@ -127,4 +133,4 @@ public async Task HqlAsync() await (testData.cleanDataAsync()); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs index 4ae52757192..9580a4ba2bc 100644 --- a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -8,6 +9,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class FunctionsIntegrationFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly => "NHibernate.Test"; protected override IList Mappings => new[] { "Criteria.Lambda.Mappings.hbm.xml" }; diff --git a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs index 9dac8b5ea81..e4610e13478 100644 --- a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs @@ -6,12 +6,18 @@ using NUnit.Framework; using NHibernate.Criterion; +using NHibernate.Dialect; namespace NHibernate.Test.Criteria.Lambda { [TestFixture] public class IntegrationFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } } protected override IList Mappings @@ -443,4 +449,4 @@ public void StatelessSession() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs index f6b5d7d9c3a..f841745c4e2 100644 --- a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Transform; using NUnit.Framework; @@ -9,6 +10,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class ProjectIntegrationFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs index 1cdd44c982a..83f287cdf1d 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -1,4 +1,5 @@ using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -6,6 +7,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SimpleIntegrationFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs index 55d1a1e5f43..81ae6811daa 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -8,6 +9,11 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SubQueryIntegrationFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs index a2361535c1f..38f422d739c 100644 --- a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs +++ b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs @@ -44,6 +44,8 @@ public void DialectShouldUseCorrectSubstringImplementation(System.Type dialectTy Assert.That(substringFunction, Is.TypeOf()); else if (dialect is SQLiteDialect) Assert.That(substringFunction, Is.TypeOf()); + else if (dialect is AbstractHanaDialect) + Assert.That(substringFunction, Is.TypeOf()); else Assert.That(substringFunction, Is.TypeOf()); diff --git a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs index 1d19a566322..71cd73e4601 100644 --- a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs @@ -3,6 +3,7 @@ using NHibernate.Collection; using NHibernate.Collection.Generic; using NHibernate.Event; +using NHibernate.Dialect; using NHibernate.Test.Events.Collections.Association.Bidirectional.ManyToMany; using NUnit.Framework; @@ -11,6 +12,11 @@ namespace NHibernate.Test.Events.Collections [TestFixture] public abstract class AbstractCollectionEventFixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index 6bb032a5b19..878681d0ee0 100644 --- a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -18,7 +18,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect); + return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.AbstractHanaDialect); } [Test] @@ -38,4 +38,4 @@ public void SequenceIdentityGenerator() session.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs index b4c6b31e5cb..9f74cf0d76a 100644 --- a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; - +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -9,6 +9,11 @@ namespace NHibernate.Test.GenericTest.Overall [TestFixture] public class Fixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get { return new[] { "GenericTest.Overall.Mappings.hbm.xml" }; } diff --git a/src/NHibernate.Test/Hql/HQLFunctions.cs b/src/NHibernate.Test/Hql/HQLFunctions.cs index 2d54fc6ebaf..2c8edcb0d7c 100644 --- a/src/NHibernate.Test/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Hql/HQLFunctions.cs @@ -936,6 +936,13 @@ public void Cast() throw; } } + else if (Dialect is AbstractHanaDialect) + { + string msgToCheck = + "not a GROUP BY expression: 'ANIMAL0_.BODYWEIGHT' must be in group by clause"; + if (!ex.InnerException.Message.Contains(msgToCheck)) + throw; + } else { string msgToCheck = diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 0a05c46e884..6c0a1ca137c 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -30,6 +30,11 @@ private static byte[] GetBytes(string str) return Encoding.Unicode.GetBytes(str); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/Legacy/FumTest.cs b/src/NHibernate.Test/Legacy/FumTest.cs index ab43bed1595..42b1d76c157 100644 --- a/src/NHibernate.Test/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Legacy/FumTest.cs @@ -5,6 +5,7 @@ using System.Runtime.Serialization.Formatters.Binary; using NHibernate.DomainModel; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Type; using NUnit.Framework; @@ -18,6 +19,11 @@ public class FumTest : TestCase { protected static short fumKeyShort = 1; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get @@ -716,4 +722,4 @@ private ISession SpoofSerialization(ISession session) return (ISession) formatter.Deserialize(stream); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Legacy/MasterDetailTest.cs index 6d3e7b4e067..707e7a7abe5 100644 --- a/src/NHibernate.Test/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Legacy/MasterDetailTest.cs @@ -19,6 +19,11 @@ namespace NHibernate.Test.Legacy [TestFixture] public class MasterDetailTest : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Legacy/MultiTableTest.cs index ee9841eb1c4..484670707d8 100644 --- a/src/NHibernate.Test/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Legacy/MultiTableTest.cs @@ -149,7 +149,7 @@ public void Queries() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = (long) s.Save(new TrivialClass()); } @@ -185,7 +185,7 @@ public void Constraints() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { s.Save(sm); } @@ -206,6 +206,11 @@ public void Constraints() [Test] public void MultiTable() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -216,7 +221,7 @@ public void MultiTable() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = s.Save(multi); sid = s.Save(simp); @@ -231,7 +236,7 @@ public void MultiTable() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { smid = s.Save(sm); } @@ -341,6 +346,11 @@ public void MultiTable() [Test] public void MultiTableGeneratedId() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -465,7 +475,7 @@ public void MultiTableCollections() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = s.Save(multi); sid = s.Save(simp); @@ -485,7 +495,7 @@ public void MultiTableCollections() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = s.Save(ls); } @@ -542,7 +552,7 @@ public void MultiTableManyToOne() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { mid = s.Save(multi); } @@ -557,7 +567,7 @@ public void MultiTableManyToOne() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect) + if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) { id = s.Save(ls); } @@ -603,6 +613,11 @@ public void MultiTableNativeId() [Test] public void Collection() { + if (Dialect is AbstractHanaDialect) + { + Assert.Ignore("HANA does not support inserting a row without specifying any column values"); + } + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi1 = new Multi(); @@ -702,4 +717,4 @@ public void DynamicUpdate() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Legacy/ParentChildTest.cs index fbc6d5913be..32b1f8fbfbc 100644 --- a/src/NHibernate.Test/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Legacy/ParentChildTest.cs @@ -13,6 +13,11 @@ namespace NHibernate.Test.Legacy [TestFixture] public class ParentChildTest : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override IList Mappings { get diff --git a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs index ebe24a0164c..49dcfb71aec 100644 --- a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -25,6 +26,11 @@ protected override void OnTearDown() } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void TestLoadParentFirst() { @@ -85,4 +91,4 @@ public void TestLoadChildFirst() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index 6abbe6da8ec..006c019ab3d 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.Associations.BiM21 @@ -17,6 +18,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.Docs.Associations.BiM21.Mappings.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void TestCorrectUse() { @@ -62,4 +68,4 @@ public void TestErrorUsage() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index e9be1db91ad..5b272e8993f 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.ExampleParentChild @@ -17,6 +18,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.Docs.ExampleParentChild.Mappings.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Update() { @@ -53,4 +59,4 @@ public void Update() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index 2815ff61c20..06f122c7878 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -1,4 +1,5 @@ -using NUnit.Framework; +using NHibernate.Dialect; +using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.GH1565 { @@ -44,6 +45,11 @@ protected override void OnTearDown() session.CreateSQLQuery("delete from MainEntity").ExecuteUpdate(); } } + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } } public class MainEntity diff --git a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs index b16ba8f4140..c773125fbe5 100644 --- a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -13,6 +14,11 @@ protected override IList Mappings get { return new string[] {"NHSpecific.LazyLoadBug.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void TestLazyLoad() { @@ -91,4 +97,4 @@ public void TestLazyLoadNoAdd() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs index 9c5a81b9046..a4919497809 100644 --- a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -4,6 +4,7 @@ using log4net.Appender; using log4net.Core; using log4net.Repository.Hierarchy; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.ListsWithHoles @@ -13,8 +14,12 @@ namespace NHibernate.Test.NHSpecificTest.ListsWithHoles [TestFixture] public class Fixture : TestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } - protected override IList Mappings + protected override IList Mappings { get { return new string[] { "NHSpecificTest.ListsWithHoles.Mappings.hbm.xml" }; } } diff --git a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index edd65f33634..99b4760bfea 100644 --- a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -1,3 +1,5 @@ +using NHibernate.Dialect; + namespace NHibernate.Test.NHSpecificTest.LoadingNullEntityInSet { using System.Collections; @@ -21,6 +23,11 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override DebugSessionFactory BuildSessionFactory() { cfg.GetCollectionMapping(typeof (Employee).FullName + ".Primaries") diff --git a/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs index 26f65d86db1..40f8cc5770e 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs @@ -8,7 +8,8 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect); + return !(dialect is Oracle8iDialect) && + !(dialect is AbstractHanaDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs index 1af7989aa05..4433f923f47 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1274ExportExclude/NH1274ExportExcludeFixture.cs @@ -58,8 +58,8 @@ public void SchemaExport_Export_CreatesExportScript() Assert.IsTrue(s.Contains("drop table Home_All")); } - Assert.IsTrue(s.Contains("create table Home_All")); - Assert.IsTrue(s.Contains("create table Home_Export")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_All")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_Export")); } [Test] @@ -71,8 +71,8 @@ public void SchemaExport_Update_CreatesUpdateScript() update.Execute(tw.WriteLine, false); string s = tw.ToString(); - Assert.IsTrue(s.Contains("create table Home_Update")); - Assert.IsTrue(s.Contains("create table Home_All")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_Update")); + Assert.That(s, Does.Match("create ((column|row) )?table Home_All")); } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs index f4cc7773dfd..ef39bcd9f13 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs @@ -1,3 +1,4 @@ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1301 @@ -10,6 +11,11 @@ public override string BugNumber get { return "NH1301"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Test() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs index 2a7a94a7550..07d158b7d75 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1388 @@ -37,6 +38,11 @@ public class Major [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void BagTest() { @@ -129,4 +135,4 @@ protected override string CacheConcurrencyStrategy get { return null; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs index 6efebb7ace0..7613aa9cfdd 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs @@ -21,7 +21,7 @@ private static void Bug(Configuration cfg) else Assert.That(script, Does.Match("drop table nhibernate.dbo.Aclass")); - Assert.That(script, Does.Match("create table nhibernate.dbo.Aclass")); + Assert.That(script, Does.Match("create ((column|row) )?table nhibernate.dbo.Aclass")); } diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs index f801ed475f9..ebbff70013e 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -6,10 +7,15 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture1 : BugTestCase { - /// - /// Loads the project do not call Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + + /// + /// Loads the project do not call Count on the list assigned. + /// + [Test] public void TestSaveAndLoadWithoutCount() { ProjectWithOneList.TestAccessToList = false; diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs index f629eff9eac..3c62d33143a 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -6,10 +7,15 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture2 : BugTestCase { - /// - /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + + /// + /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. + /// + [Test] public void TestSaveAndLoadWithTwoCounts() { Project.TestAccessToList = false; diff --git a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs index 5fb0474b9f6..f0aa0c614a6 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs @@ -1,5 +1,6 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; @@ -13,6 +14,11 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Test() { @@ -71,4 +77,4 @@ private EntityB CreateEntityB(ISession session, EntityA a, EntityC c) return b; } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs index 68b364eb2be..c361bd99a16 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1691 @@ -6,6 +7,11 @@ namespace NHibernate.Test.NHSpecificTest.NH1691 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private static Component GetInitializedComponent() { var component = new Component(); @@ -112,4 +118,4 @@ public void NestedComponentCollection() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs index d8aa1826874..843d320589e 100755 --- a/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs @@ -9,7 +9,8 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect); + return !(dialect is Oracle8iDialect) && + !(dialect is AbstractHanaDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs index d69c8a630d6..86c5ce591ea 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs @@ -1,4 +1,5 @@ using System.Collections; +using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; @@ -14,6 +15,11 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnTearDown() { using (var session = Sfi.OpenSession()) @@ -64,4 +70,4 @@ private IList GetResult(ISession session) return multi.List(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs index 9c87004392b..66a833293ef 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1914 @@ -7,6 +8,10 @@ namespace NHibernate.Test.NHSpecificTest.NH1914 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } [Test] public void CascadeInsertAssigned() diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs index a0dcb58b148..547bb688141 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs @@ -1,4 +1,5 @@ using System.Linq; +using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2328 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { base.OnSetUp(); @@ -98,4 +104,4 @@ public void AnyIs_HqlWorksWithClassNameInTheLeft() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs index bb12d516a2c..0b8da2ceed0 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using NHibernate.Criterion; +using NHibernate.Dialect; using NHibernate.SqlCommand; using NUnit.Framework; @@ -9,6 +10,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2409 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Bug() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs index 6cb1673da80..3e1e002a14a 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs @@ -1,3 +1,4 @@ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2703 @@ -7,6 +8,11 @@ public class Fixture : BugTestCase { Parent RootElement = null; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using (ISession session = Sfi.OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs index e70545a672b..6b0544b22d8 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -19,6 +20,11 @@ private static IEnumerable GetAndFetch(string name, ISession session) wher .Where(p => p.SubItem.Name == name).ToList(); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Fetch_OnComponent_ShouldNotThrow() { @@ -82,4 +88,4 @@ public void LinqQueryWithFetch_WhenDerivedClassesUseComponentAndEagerFetchManyTo } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs index ef66f7cb5ef..342f9746e4e 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs @@ -11,12 +11,18 @@ using NUnit.Framework; using System.Linq; +using NHibernate.Dialect; namespace NHibernate.Test.NHSpecificTest.NH3050 { [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Test() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs index d43a3aaf481..6fc61d19050 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3141 @@ -9,6 +10,11 @@ public class ProxyIdFixture : BugTestCase { private int id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs index 5b5279d0c8a..9149c9d4671 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH315 @@ -14,6 +15,11 @@ public override string BugNumber get { return "NH315"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void SaveClient() { @@ -43,4 +49,4 @@ public void SaveClient() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs index 174af83a6b0..753723f2def 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH386"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Query() { @@ -21,4 +27,4 @@ public void Query() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs index 32080c5fa3d..74c3a9f256c 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH440 @@ -21,6 +22,11 @@ protected override IList Mappings get { return new string[] {"NHSpecificTest.NH440.Fruit.hbm.xml", "NHSpecificTest.NH440.Apple.hbm.xml"}; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { @@ -139,4 +145,4 @@ public void StoreWithLinksAndLookupWithQueryFromFruit() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs index cae122f1407..25f1aa73d99 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH473 @@ -8,6 +9,11 @@ namespace NHibernate.Test.NHSpecificTest.NH473 [TestFixture] public class Fixture:BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + protected override void OnSetUp() { using(var session=this.OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs index f28fcc5ed40..a7b26fdb8ed 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH479 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH479"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void MergeTest() { @@ -46,4 +52,4 @@ public void MergeTest() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs index 793b3cd568f..7a6955d51b6 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs @@ -1,3 +1,4 @@ +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH521 @@ -10,6 +11,11 @@ public override string BugNumber get { return "NH521"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void AttachUninitProxyCausesInit() { @@ -57,4 +63,4 @@ public void AttachUninitProxyCausesInit() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs index 1e5045c17d3..9dae5322567 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH607 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH607"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Test() { @@ -43,4 +49,4 @@ public void Test() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs index 5bb1c16ee9f..603e19c36ba 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH623 @@ -12,6 +13,11 @@ public override string BugNumber get { return "NH623"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean + } + private ISession session; private ITransaction tran; @@ -71,4 +77,4 @@ public void WhereAttributesOnBags() Assert.AreEqual(1, d.Pages.Count); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs index 8967d4356c8..47cdbed7016 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH643 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH643"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private object parentId; [Test] @@ -72,4 +78,4 @@ private void CheckChildrenCount(int count) } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs index 843640e7c7d..41be2c6d4bd 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH687 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH687"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void GetQueryTest() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs index be2482e3fad..d3ddd31d80c 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH704 @@ -11,6 +12,11 @@ public override string BugNumber get { return "NH704"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void ReAttachCatTest() { @@ -35,4 +41,4 @@ public void ReAttachCatTest() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs index 88103136994..9118b855e99 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs @@ -1,4 +1,5 @@ using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH826 @@ -6,6 +7,11 @@ namespace NHibernate.Test.NHSpecificTest.NH826 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Bug() { @@ -48,4 +54,4 @@ public void Bug() session.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs index 15ee45a0f22..16067049681 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -1,5 +1,6 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH830 @@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.NH830 [TestFixture] public class AutoFlushTestFixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void AutoFlushTest() { @@ -39,4 +45,4 @@ public void AutoFlushTest() sess.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs index f77717854bc..6fd01c465b4 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs @@ -1,6 +1,6 @@ using System; using System.Collections; - +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH898 @@ -22,6 +22,11 @@ protected override IList Mappings } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void Bug() { diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs index 77893017777..bdfccc2e5af 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -10,6 +11,11 @@ public class CompositePropertyRefTest : BugTestCase private long p_id; private long p2_id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs index 7c5a7ba4b16..7481b3215f4 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTest : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index 5d822391ca9..d783445f1c8 100644 --- a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -1,4 +1,5 @@ using NHibernate.Cfg; +using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; using NUnit.Framework; @@ -24,6 +25,11 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver is SqlClientDriver; } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + [Test] public void NormalHqlShouldThrowUserException() { diff --git a/src/NHibernate.Test/Operations/MergeFixture.cs b/src/NHibernate.Test/Operations/MergeFixture.cs index 201d3ee7233..9922883c790 100644 --- a/src/NHibernate.Test/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Operations/MergeFixture.cs @@ -10,7 +10,8 @@ public class MergeFixture : AbstractOperationTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Dialect.FirebirdDialect); // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture + return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture + !(dialect is Dialect.AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs index 562d0e56328..c7026ac0744 100644 --- a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs @@ -1,5 +1,6 @@ using System.Collections; using NHibernate.Cfg; +using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Stateless @@ -23,6 +24,11 @@ protected override void Configure(Configuration configuration) cfg.SetProperty(Environment.MaxFetchDepth, 1.ToString()); } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + } + private class TestData { internal readonly IList list = new ArrayList(); @@ -115,4 +121,4 @@ public void Hql() testData.cleanData(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs b/src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs new file mode 100644 index 00000000000..1da24174114 --- /dev/null +++ b/src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs @@ -0,0 +1,14 @@ +namespace NHibernate.Test.TestDialects +{ + public abstract class AbstractHanaTestDialect : TestDialect + { + public AbstractHanaTestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } + + public override bool SupportsComplexExpressionInGroupBy => false; + + public override bool SupportsEmptyInserts => false; + } +} diff --git a/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs new file mode 100644 index 00000000000..8a2d3b4f8ba --- /dev/null +++ b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs @@ -0,0 +1,10 @@ +namespace NHibernate.Test.TestDialects +{ + public class HanaColumnStoreTestDialect : AbstractHanaTestDialect + { + public HanaColumnStoreTestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } + } +} diff --git a/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs new file mode 100644 index 00000000000..1fec5201678 --- /dev/null +++ b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs @@ -0,0 +1,10 @@ +namespace NHibernate.Test.TestDialects +{ + public class HanaRowStoreTestDialect : AbstractHanaTestDialect + { + public HanaRowStoreTestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } + } +} diff --git a/src/NHibernate.Test/TransactionTest/TransactionFixtureBase.cs b/src/NHibernate.Test/TransactionTest/TransactionFixtureBase.cs index 16c21294c78..f2530e91da6 100644 --- a/src/NHibernate.Test/TransactionTest/TransactionFixtureBase.cs +++ b/src/NHibernate.Test/TransactionTest/TransactionFixtureBase.cs @@ -87,4 +87,4 @@ public override void PreFlush(ICollection entitites) } } } -} \ No newline at end of file +} diff --git a/src/NHibernate/AdoNet/GenericBatchingBatcher.cs b/src/NHibernate/AdoNet/GenericBatchingBatcher.cs index 26074117c4a..83840f55cba 100644 --- a/src/NHibernate/AdoNet/GenericBatchingBatcher.cs +++ b/src/NHibernate/AdoNet/GenericBatchingBatcher.cs @@ -17,6 +17,7 @@ namespace NHibernate.AdoNet /// - FirebirdSql.Data.FirebirdClient /// - Oracle.ManagedDataAccess /// - System.Data.SqlServerCe + /// - Sap.Data.Hana /// public partial class GenericBatchingBatcher : AbstractBatcher { diff --git a/src/NHibernate/Dialect/AbstractHanaDialect.cs b/src/NHibernate/Dialect/AbstractHanaDialect.cs new file mode 100644 index 00000000000..43c463d17c6 --- /dev/null +++ b/src/NHibernate/Dialect/AbstractHanaDialect.cs @@ -0,0 +1,1257 @@ +using System; +using System.Collections; +using System.Data; +using System.Data.Common; +using System.Text; +using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; +using NHibernate.Engine; +using NHibernate.SqlCommand; +using NHibernate.SqlTypes; +using NHibernate.Type; +using NHibernate.Util; +using Environment = NHibernate.Cfg.Environment; + +namespace NHibernate.Dialect +{ + /// + /// A SQL dialect base class for SAP HANA + /// + /// + /// The AbstractHanaDialect defaults the following configuration properties: + /// + /// + /// Property + /// Default Value + /// + /// + /// connection.driver_class + /// + /// + /// + /// + public abstract class AbstractHanaDialect : Dialect + { + [Serializable] + private class TypeConvertingVarArgsSQLFunction : ISQLFunction + { + private readonly string begin; + private readonly string sep; + private readonly string end; + private SqlType type = null; + private Dialect dialect = null; + + public TypeConvertingVarArgsSQLFunction(string begin, string sep, string end) + { + this.begin = begin; + this.sep = sep; + this.end = end; + } + + #region ISQLFunction Members + + public IType ReturnType(IType columnType, IMapping mapping) + { + type = columnType.SqlTypes(mapping)[0]; + dialect = mapping.Dialect; + return columnType; + } + + public bool HasArguments + { + get { return true; } + } + + public bool HasParenthesesIfNoArguments + { + get { return true; } + } + + public SqlString Render(IList args, ISessionFactoryImplementor factory) + { + SqlStringBuilder buf = new SqlStringBuilder().Add(begin); + for (int i = 0; i < args.Count; i++) + { + object arg = args[i]; + if (arg is SqlString && (arg as SqlString).EqualsCaseInsensitive("?")) + { + buf.Add("cast("); + buf.AddObject(arg); + buf.Add(" as "); + buf.Add(dialect.GetCastTypeName(type)); + buf.Add(")"); + } + else + { + buf.AddObject(arg); + } + if (i < args.Count - 1) buf.Add(sep); + } + return buf.Add(end).ToSqlString(); + } + + #endregion + } + + public AbstractHanaDialect() + { + //string type + RegisterColumnType(DbType.AnsiStringFixedLength, "VARCHAR(255)"); + RegisterColumnType(DbType.AnsiStringFixedLength, 5000, "VARCHAR($l)"); + RegisterColumnType(DbType.AnsiStringFixedLength, 2147483647, "CLOB"); + RegisterColumnType(DbType.AnsiString, "VARCHAR(255)"); + RegisterColumnType(DbType.AnsiString, 5000, "VARCHAR($l)"); + RegisterColumnType(DbType.AnsiString, 2147483647, "CLOB"); + RegisterColumnType(DbType.StringFixedLength, "NVARCHAR(255)"); + RegisterColumnType(DbType.StringFixedLength, 5000, "NVARCHAR($l)"); + RegisterColumnType(DbType.StringFixedLength, 2147483647, "NCLOB"); + RegisterColumnType(DbType.String, "NVARCHAR(255)"); + RegisterColumnType(DbType.String, 5000, "NVARCHAR($l)"); + RegisterColumnType(DbType.String, 2147483647, "NCLOB"); + + //binary type: + RegisterColumnType(DbType.Binary, "VARBINARY(5000)"); + RegisterColumnType(DbType.Binary, 5000, "VARBINARY($l)"); + RegisterColumnType(DbType.Binary, 2147483647, "BLOB"); + + //Numeric type: + RegisterColumnType(DbType.Boolean, "BOOLEAN"); + RegisterColumnType(DbType.Byte, "TINYINT"); + RegisterColumnType(DbType.Currency, "DECIMAL(19, 4)"); + RegisterColumnType(DbType.Decimal, "DECIMAL(19, 5)"); + RegisterColumnType(DbType.Decimal, 29, "DECIMAL($p, $s)"); + RegisterColumnType(DbType.Double, "DOUBLE"); + RegisterColumnType(DbType.Int16, "SMALLINT"); + RegisterColumnType(DbType.Int32, "INTEGER"); + RegisterColumnType(DbType.Int64, "BIGINT"); + RegisterColumnType(DbType.Single, "FLOAT"); + RegisterColumnType(DbType.SByte, "SMALLINT"); + + //Date and time type: + RegisterColumnType(DbType.Date, "DATE"); + RegisterColumnType(DbType.DateTime, "TIMESTAMP"); + RegisterColumnType(DbType.Time, "TIME"); + + //special: + RegisterColumnType(DbType.Guid, "VARCHAR(36)"); + + RegisterKeywords(); + + //functions: + RegisterFunctions(); + + DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.HanaDriver"; + } + + #region private static readonly string[] DialectKeywords = { ... } + + private static readonly string[] DialectKeywords = + { + "add", + "aes_decrypt", + "all", + "alphanum", + "alter", + "and", + "any", + "array", + "as", + "asc", + "attach", + "backup", + "begin", + "between", + "bigint", + "binary", + "bit", + "bottom", + "break", + "by", + "call", + "capability", + "cascade", + "case", + "cast", + "char", + "char_convert", + "character", + "check", + "checkpoint", + "close", + "comment", + "commit", + "compressed", + "conflict", + "connect", + "constraint", + "contains", + "continue", + "convert", + "create", + "cross", + "cube", + "current", + "current_timestamp", + "current_user", + "cursor", + "date", + "datetimeoffset", + "dbspace", + "deallocate", + "dec", + "decimal", + "declare", + "default", + "delete", + "deleting", + "desc", + "detach", + "distinct", + "do", + "double", + "drop", + "dynamic", + "else", + "elseif", + "encrypted", + "end", + "endif", + "escape", + "except", + "exception", + "exec", + "execute", + "existing", + "exists", + "externlogin", + "fetch", + "first", + "float", + "for", + "force", + "foreign", + "forward", + "from", + "full", + "goto", + "grant", + "group", + "having", + "holdlock", + "identified", + "if", + "in", + "index", + "inner", + "inout", + "insensitive", + "insert", + "inserting", + "install", + "instead", + "integer", + "integrated", + "intersect", + "into", + "iq", + "is", + "isolation", + "join", + "json", + "kerberos", + "key", + "lateral", + "left", + "like", + "limit", + "lock", + "login", + "long", + "match", + "membership", + "merge", + "message", + "mode", + "modify", + "natural", + "nchar", + "new", + "no", + "noholdlock", + "not", + "notify", + "null", + "numeric", + "nvarchar", + "of", + "off", + "on", + "open", + "openstring", + "openxml", + "option", + "options", + "or", + "order", + "others", + "out", + "outer", + "over", + "passthrough", + "precision", + "prepare", + "primary", + "print", + "privileges", + "proc", + "procedure", + "publication", + "raiserror", + "readtext", + "real", + "reference", + "references", + "refresh", + "release", + "remote", + "remove", + "rename", + "reorganize", + "resource", + "restore", + "restrict", + "return", + "revoke", + "right", + "rollback", + "rollup", + "row", + "rowtype", + "save", + "savepoint", + "scroll", + "seconddate", + "select", + "sensitive", + "session", + "set", + "setuser", + "share", + "shorttext", + "smalldecimal", + "smallint", + "some", + "spatial", + "sqlcode", + "sqlstate", + "start", + "stop", + "subtrans", + "subtransaction", + "synchronize", + "table", + "temporary", + "text", + "then", + "time", + "timestamp", + "tinyint", + "to", + "top", + "treat", + "trigger", + "truncate", + "tsequal", + "unbounded", + "union", + "unique", + "uniqueidentifier", + "unknown", + "unnest", + "unsigned", + "update", + "updating", + "user", + "using", + "validate", + "values", + "varbinary", + "varbit", + "varchar", + "variable", + "varray", + "varying", + "view", + "wait", + "waitfor", + "when", + "where", + "while", + "window", + "with", + "within", + "work", + "writetext", + "xml" + }; + + #endregion + + protected virtual void RegisterKeywords() + { + RegisterKeywords(DialectKeywords); + } + + protected virtual void RegisterFunctions() + { + RegisterHANAFunctions(); + RegisterNHibernateFunctions(); + } + + protected virtual void RegisterNHibernateFunctions() + { + RegisterFunction("band", new BitwiseFunctionOperation("bitand")); + RegisterFunction("bor", new BitwiseFunctionOperation("bitor")); + RegisterFunction("bxor", new BitwiseFunctionOperation("bitxor")); + RegisterFunction("bnot", new BitwiseFunctionOperation("bitnot")); + RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "length(to_binary(?1))*8")); + RegisterFunction("ceiling", new StandardSQLFunction("ceil")); + RegisterFunction("chr", new StandardSQLFunction("char", NHibernateUtil.AnsiChar)); + RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.Date, "to_date(?1)")); + RegisterFunction("iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); + RegisterFunction("Iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); + RegisterFunction("sysdate", new NoArgSQLFunction("current_timestamp", NHibernateUtil.DateTime, false)); + RegisterFunction("truncate", new SQLFunctionTemplateWithRequiredParameters(null, "floor(?1 * power(10, ?2)) / power(10, ?2)", new object[] { null, "0" })); + } + + protected virtual void RegisterHANAFunctions() + { + RegisterFunction("abap_alphanum", new StandardSQLFunction("abap_alphanum", NHibernateUtil.String)); + RegisterFunction("abap_lower", new StandardSQLFunction("abap_lower", NHibernateUtil.String)); + RegisterFunction("abap_numc", new StandardSQLFunction("abap_numc", NHibernateUtil.String)); + RegisterFunction("abap_upper", new StandardSQLFunction("abap_upper", NHibernateUtil.String)); + RegisterFunction("abs", new StandardSQLFunction("abs")); + RegisterFunction("acos", new StandardSQLFunction("acos", NHibernateUtil.Double)); + RegisterFunction("add_days", new StandardSQLFunction("add_days", NHibernateUtil.DateTime)); + RegisterFunction("add_months", new StandardSQLFunction("add_months", NHibernateUtil.DateTime)); + RegisterFunction("add_months_last", new StandardSQLFunction("add_months_last", NHibernateUtil.DateTime)); + RegisterFunction("add_seconds", new StandardSQLFunction("add_seconds", NHibernateUtil.DateTime)); + RegisterFunction("add_workdays", new StandardSQLFunction("add_workdays", NHibernateUtil.DateTime)); + RegisterFunction("add_years", new StandardSQLFunction("add_years", NHibernateUtil.DateTime)); + RegisterFunction("ascii", new StandardSQLFunction("ascii", NHibernateUtil.Int32)); + RegisterFunction("asin", new StandardSQLFunction("asin", NHibernateUtil.Double)); + RegisterFunction("atan", new StandardSQLFunction("atan", NHibernateUtil.Double)); + RegisterFunction("atan2", new StandardSQLFunction("atan2", NHibernateUtil.Double)); + RegisterFunction("auto_corr", new StandardSQLFunction("auto_corr", NHibernateUtil.Object)); + RegisterFunction("bintohex", new StandardSQLFunction("bintohex", NHibernateUtil.String)); + RegisterFunction("bintonhex", new StandardSQLFunction("bintonhex", NHibernateUtil.String)); + RegisterFunction("bintostr", new StandardSQLFunction("bintostr", NHibernateUtil.String)); + RegisterFunction("bitand", new StandardSQLFunction("bitand")); + RegisterFunction("bitcount", new StandardSQLFunction("bitcount", NHibernateUtil.Int32)); + RegisterFunction("bitnot", new StandardSQLFunction("bitnot")); + RegisterFunction("bitor", new StandardSQLFunction("bitor")); + RegisterFunction("bitset", new StandardSQLFunction("bitset", NHibernateUtil.Binary)); + RegisterFunction("bitunset", new StandardSQLFunction("bitunset", NHibernateUtil.Binary)); + RegisterFunction("bitxor", new StandardSQLFunction("bitxor")); + RegisterFunction("cardinality", new StandardSQLFunction("cardinality", NHibernateUtil.Int32)); + RegisterFunction("cast", new CastFunction()); + RegisterFunction("ceil", new StandardSQLFunction("ceil")); + RegisterFunction("char", new StandardSQLFunction("char", NHibernateUtil.AnsiChar)); + RegisterFunction("coalesce", new TypeConvertingVarArgsSQLFunction("coalesce(", ",", ")")); + RegisterFunction("concat", new VarArgsSQLFunction("(", " || ", ")")); + RegisterFunction("concat_naz", new StandardSQLFunction("concat_naz", NHibernateUtil.String)); + RegisterFunction("convert_currency", new VarArgsSQLFunction("convert_currency(", ",", ")")); + RegisterFunction("convert_unit", new VarArgsSQLFunction("convert_unit(", ",", ")")); + RegisterFunction("cos", new StandardSQLFunction("cos", NHibernateUtil.Double)); + RegisterFunction("cosh", new StandardSQLFunction("cosh", NHibernateUtil.Double)); + RegisterFunction("cot", new StandardSQLFunction("cot", NHibernateUtil.Double)); + RegisterFunction("current_connection", new NoArgSQLFunction("current_connection", NHibernateUtil.Int32)); + RegisterFunction("current_date", new NoArgSQLFunction("current_date", NHibernateUtil.DateTime, false)); + RegisterFunction("current_identity_value", new NoArgSQLFunction("current_identity_value", NHibernateUtil.Int64)); + RegisterFunction("current_mvcc_snapshot_timestamp", new NoArgSQLFunction("current_mvcc_snapshot_timestamp", NHibernateUtil.Int32)); + RegisterFunction("current_object_schema", new NoArgSQLFunction("current_object_schema", NHibernateUtil.String)); + RegisterFunction("current_schema", new NoArgSQLFunction("current_schema", NHibernateUtil.String, false)); + RegisterFunction("current_time", new NoArgSQLFunction("current_time", NHibernateUtil.DateTime, false)); + RegisterFunction("current_timestamp", new NoArgSQLFunction("current_timestamp", NHibernateUtil.DateTime, false)); + RegisterFunction("current_transaction_isolation_level", new NoArgSQLFunction("current_transaction_isolation_level", NHibernateUtil.String, false)); + RegisterFunction("current_update_statement_sequence", new NoArgSQLFunction("current_update_statement_sequence", NHibernateUtil.Int64)); + RegisterFunction("current_update_transaction", new NoArgSQLFunction("current_update_transaction", NHibernateUtil.Int64)); + RegisterFunction("current_user", new NoArgSQLFunction("current_user", NHibernateUtil.String, false)); + RegisterFunction("current_utcdate", new NoArgSQLFunction("current_utcdate", NHibernateUtil.DateTime, false)); + RegisterFunction("current_utctime", new NoArgSQLFunction("current_utctime", NHibernateUtil.DateTime, false)); + RegisterFunction("current_utctimestamp", new NoArgSQLFunction("current_utctimestamp", NHibernateUtil.DateTime, false)); + RegisterFunction("dayname", new StandardSQLFunction("dayname", NHibernateUtil.String)); + RegisterFunction("dayofmonth", new StandardSQLFunction("dayofmonth", NHibernateUtil.Int32)); + RegisterFunction("dayofyear", new StandardSQLFunction("dayofyear", NHibernateUtil.Int32)); + RegisterFunction("days_between", new StandardSQLFunction("days_between", NHibernateUtil.Int32)); + RegisterFunction("encryption_root_keys_extract_keys", new StandardSQLFunction("encryption_root_keys_extract_keys", NHibernateUtil.StringClob)); + RegisterFunction("encryption_root_keys_has_backup_password", new StandardSQLFunction("encryption_root_keys_has_backup_password", NHibernateUtil.Int16)); + RegisterFunction("escape_double_quotes", new StandardSQLFunction("escape_double_quotes", NHibernateUtil.String)); + RegisterFunction("escape_single_quotes", new StandardSQLFunction("escape_single_quotes", NHibernateUtil.String)); + RegisterFunction("exp", new StandardSQLFunction("exp", NHibernateUtil.Double)); + RegisterFunction("extract", new AnsiExtractFunction()); + RegisterFunction("floor", new StandardSQLFunction("floor")); + RegisterFunction("greatest", new VarArgsSQLFunction("greatest(", ",", ")")); + RegisterFunction("grouping", new StandardSQLFunction("grouping", NHibernateUtil.Int32)); + RegisterFunction("grouping_id", new StandardSQLFunction("grouping_id", NHibernateUtil.Int32)); + RegisterFunction("hamming_distance", new StandardSQLFunction("hamming_distance", NHibernateUtil.Int32)); + RegisterFunction("hash_md5", new StandardSQLFunction("hash_md5", NHibernateUtil.Binary)); + RegisterFunction("hash_sha256", new StandardSQLFunction("hash_sha256", NHibernateUtil.Binary)); + RegisterFunction("hextobin", new StandardSQLFunction("hextobin", NHibernateUtil.Binary)); + RegisterFunction("hour", new StandardSQLFunction("hour", NHibernateUtil.Int32)); + RegisterFunction("ifnull", new StandardSQLFunction("ifnull")); + RegisterFunction("indexing_error_code", new StandardSQLFunction("indexing_error_code", NHibernateUtil.Int32)); + RegisterFunction("indexing_error_message", new StandardSQLFunction("indexing_error_message", NHibernateUtil.String)); + RegisterFunction("indexing_status", new StandardSQLFunction("indexing_status", NHibernateUtil.String)); + RegisterFunction("initcap", new StandardSQLFunction("initcap", NHibernateUtil.String)); + RegisterFunction("is_sql_injection_safe", new StandardSQLFunction("is_sql_injection_safe", NHibernateUtil.Int32)); + RegisterFunction("isoweek", new StandardSQLFunction("isoweek", NHibernateUtil.Int32)); + RegisterFunction("language", new StandardSQLFunction("language", NHibernateUtil.String)); + RegisterFunction("last_day", new StandardSQLFunction("last_day", NHibernateUtil.DateTime)); + RegisterFunction("lcase", new StandardSQLFunction("lcase", NHibernateUtil.String)); + RegisterFunction("least", new VarArgsSQLFunction("least(", ",", ")")); + RegisterFunction("left", new StandardSQLFunction("left", NHibernateUtil.String)); + RegisterFunction("length", new StandardSQLFunction("length", NHibernateUtil.Int32)); + RegisterFunction("ln", new StandardSQLFunction("ln", NHibernateUtil.Double)); + RegisterFunction("localtoutc", new StandardSQLFunction("localtoutc", NHibernateUtil.DateTime)); + RegisterFunction("locate", new SQLFunctionTemplateWithRequiredParameters(NHibernateUtil.Int32, "locate(?2, ?1, ?3)", new object[] { null, null, "0" })); + RegisterFunction("locate_regexpr", new StandardSQLFunction("locate_regexpr", NHibernateUtil.Int32)); + RegisterFunction("log", new StandardSQLFunction("log", NHibernateUtil.Double)); + RegisterFunction("lower", new StandardSQLFunction("lower", NHibernateUtil.String)); + RegisterFunction("lpad", new StandardSQLFunction("lpad", NHibernateUtil.String)); + RegisterFunction("ltrim", new StandardSQLFunction("ltrim", NHibernateUtil.String)); + RegisterFunction("map", new VarArgsSQLFunction("map(", ",", ")")); + RegisterFunction("mimetype", new StandardSQLFunction("mimetype", NHibernateUtil.String)); + RegisterFunction("minute", new StandardSQLFunction("minute", NHibernateUtil.Int32)); + RegisterFunction("mod", new StandardSQLFunction("mod", NHibernateUtil.Int32)); + RegisterFunction("month", new StandardSQLFunction("month", NHibernateUtil.Int32)); + RegisterFunction("monthname", new StandardSQLFunction("monthname", NHibernateUtil.String)); + RegisterFunction("months_between", new StandardSQLFunction("months_between", NHibernateUtil.Int32)); + RegisterFunction("nano100_between", new StandardSQLFunction("nano100_between", NHibernateUtil.Int64)); + RegisterFunction("nchar", new StandardSQLFunction("nchar", NHibernateUtil.Character)); + RegisterFunction("ndiv0", new StandardSQLFunction("ndiv0", NHibernateUtil.Double)); + RegisterFunction("next_day", new StandardSQLFunction("next_day", NHibernateUtil.DateTime)); + RegisterFunction("newuid", new NoArgSQLFunction("newuid", NHibernateUtil.String)); + RegisterFunction("now", new NoArgSQLFunction("now", NHibernateUtil.DateTime)); + RegisterFunction("nullif", new StandardSQLFunction("nullif")); + RegisterFunction("occurrences_regexpr", new StandardSQLFunction("occurrences_regexpr", NHibernateUtil.Int32)); + RegisterFunction("plaintext", new StandardSQLFunction("plaintext", NHibernateUtil.String)); + RegisterFunction("power", new StandardSQLFunction("power", NHibernateUtil.Double)); + RegisterFunction("quarter", new StandardSQLFunction("quarter", NHibernateUtil.String)); + RegisterFunction("rand", new NoArgSQLFunction("rand", NHibernateUtil.Double)); + RegisterFunction("rand_secure", new NoArgSQLFunction("rand_secure", NHibernateUtil.Double)); + RegisterFunction("replace", new StandardSQLFunction("replace", NHibernateUtil.String)); + RegisterFunction("replace_regexpr", new StandardSQLFunction("replace_regexpr", NHibernateUtil.String)); + RegisterFunction("result_cache_id", new NoArgSQLFunction("result_cache_id", NHibernateUtil.Int64)); + RegisterFunction("result_cache_refresh_time", new NoArgSQLFunction("result_cache_refresh_time", NHibernateUtil.DateTime)); + RegisterFunction("right", new StandardSQLFunction("right", NHibernateUtil.String)); + RegisterFunction("round", new StandardSQLFunction("round")); + RegisterFunction("rpad", new StandardSQLFunction("rpad", NHibernateUtil.String)); + RegisterFunction("rtrim", new StandardSQLFunction("rtrim", NHibernateUtil.String)); + RegisterFunction("score", new NoArgSQLFunction("score", NHibernateUtil.Double)); + RegisterFunction("second", new StandardSQLFunction("second", NHibernateUtil.Double)); + RegisterFunction("seconds_between", new StandardSQLFunction("seconds_between", NHibernateUtil.Int64)); + RegisterFunction("session_context", new StandardSQLFunction("session_context", NHibernateUtil.String)); + RegisterFunction("session_user", new NoArgSQLFunction("session_user", NHibernateUtil.String, false)); + RegisterFunction("sign", new StandardSQLFunction("sign", NHibernateUtil.Int32)); + RegisterFunction("sin", new StandardSQLFunction("sin", NHibernateUtil.Double)); + RegisterFunction("sinh", new StandardSQLFunction("sinh", NHibernateUtil.Double)); + RegisterFunction("soundex", new StandardSQLFunction("soundex", NHibernateUtil.String)); + RegisterFunction("sqrt", new StandardSQLFunction("sqrt", NHibernateUtil.Double)); + RegisterFunction("stddev_pop", new StandardSQLFunction("stddev_pop", NHibernateUtil.Double)); + RegisterFunction("stddev_samp", new StandardSQLFunction("stddev_samp", NHibernateUtil.Double)); + RegisterFunction("string_agg", new StandardSQLFunction("String_agg", NHibernateUtil.String)); + RegisterFunction("strtobin", new StandardSQLFunction("strtobin", NHibernateUtil.BinaryBlob)); + RegisterFunction("subarray", new StandardSQLFunction("subarray")); + RegisterFunction("substr_after", new StandardSQLFunction("substr_after", NHibernateUtil.String)); + RegisterFunction("substr_before", new StandardSQLFunction("substr_before", NHibernateUtil.String)); + RegisterFunction("substring_regexpr", new StandardSQLFunction("substring_regexpr", NHibernateUtil.String)); + RegisterFunction("substring", new StandardSQLFunction("substring", NHibernateUtil.String)); + RegisterFunction("sysuuid", new NoArgSQLFunction("sysuuid", NHibernateUtil.String, false)); + RegisterFunction("tan", new StandardSQLFunction("tan", NHibernateUtil.Double)); + RegisterFunction("tanh", new StandardSQLFunction("tanh", NHibernateUtil.Double)); + RegisterFunction("to_alphanum", new StandardSQLFunction("to_alphanum", NHibernateUtil.String)); + RegisterFunction("to_bigint", new StandardSQLFunction("to_bigint", NHibernateUtil.Int64)); + RegisterFunction("to_binary", new StandardSQLFunction("to_binary", NHibernateUtil.Binary)); + RegisterFunction("to_blob", new StandardSQLFunction("to_blob", NHibernateUtil.BinaryBlob)); + RegisterFunction("to_clob", new StandardSQLFunction("to_clob", NHibernateUtil.StringClob)); + RegisterFunction("to_date", new StandardSQLFunction("to_date", NHibernateUtil.Date)); + RegisterFunction("to_dats", new StandardSQLFunction("to_dats", NHibernateUtil.String)); + RegisterFunction("to_decimal", new StandardSQLFunction("to_decimal", NHibernateUtil.Decimal)); + RegisterFunction("to_double", new StandardSQLFunction("to_double", NHibernateUtil.Double)); + RegisterFunction("to_fixedchar", new StandardSQLFunction("to_fixedchar", NHibernateUtil.Character)); + RegisterFunction("to_int", new StandardSQLFunction("to_int", NHibernateUtil.Int32)); + RegisterFunction("to_integer", new StandardSQLFunction("to_integer", NHibernateUtil.Int32)); + RegisterFunction("to_nclob", new StandardSQLFunction("to_nclob", NHibernateUtil.StringClob)); + RegisterFunction("to_nvarchar", new StandardSQLFunction("to_nvarchar", NHibernateUtil.String)); + RegisterFunction("to_real", new StandardSQLFunction("to_real", NHibernateUtil.Double)); + RegisterFunction("to_seconddate", new StandardSQLFunction("to_seconddate", NHibernateUtil.DateTime)); + RegisterFunction("to_smalldecimal", new StandardSQLFunction("to_smalldecimal", NHibernateUtil.Decimal)); + RegisterFunction("to_smallint", new StandardSQLFunction("to_smallint", NHibernateUtil.Int16)); + RegisterFunction("to_time", new StandardSQLFunction("to_time", NHibernateUtil.Time)); + RegisterFunction("to_timestamp", new StandardSQLFunction("to_timestamp", NHibernateUtil.DateTime)); + RegisterFunction("to_tinyint", new StandardSQLFunction("to_tinyint", NHibernateUtil.Byte)); + RegisterFunction("to_varchar", new StandardSQLFunction("to_varchar", NHibernateUtil.AnsiString)); + RegisterFunction("trim", new AnsiTrimFunction()); + RegisterFunction("trim_array", new StandardSQLFunction("trim_array")); + RegisterFunction("ucase", new StandardSQLFunction("ucase", NHibernateUtil.String)); + RegisterFunction("uminus", new StandardSQLFunction("uminus")); + RegisterFunction("unicode", new StandardSQLFunction("unicode", NHibernateUtil.Int32)); + RegisterFunction("upper", new StandardSQLFunction("upper", NHibernateUtil.String)); + RegisterFunction("utctolocal", new StandardSQLFunction("utctolocal", NHibernateUtil.DateTime)); + RegisterFunction("var_pop", new StandardSQLFunction("var_pop", NHibernateUtil.Double)); + RegisterFunction("var_samp", new StandardSQLFunction("var_samp", NHibernateUtil.Double)); + RegisterFunction("week", new StandardSQLFunction("week", NHibernateUtil.Int32)); + RegisterFunction("weekday", new StandardSQLFunction("weekday", NHibernateUtil.Int32)); + RegisterFunction("width_bucket", new StandardSQLFunction("width_bucket", NHibernateUtil.Int32)); + RegisterFunction("workdays_between", new StandardSQLFunction("workdays_between", NHibernateUtil.Int32)); + RegisterFunction("xmlextract", new StandardSQLFunction("xmlextract", NHibernateUtil.String)); + RegisterFunction("xmlextractvalue", new StandardSQLFunction("xmlextractvalue", NHibernateUtil.String)); + RegisterFunction("xmltable", new StandardSQLFunction("xmltable")); + RegisterFunction("year", new StandardSQLFunction("year", NHibernateUtil.Int32)); + RegisterFunction("years_between", new StandardSQLFunction("years_between", NHibernateUtil.Int32)); + + } + + #region DDL support + + /// + /// Do we need to drop constraints before dropping tables in the dialect? + /// + public override bool DropConstraints => false; + + /// + /// Do we need to qualify index names with the schema name? + /// + public override bool QualifyIndexName => false; + + public override bool SupportsCommentOn => true; + + public override string GetTableComment(string comment) + { + return "comment '" + comment + "'"; + } + + public override string GetColumnComment(string comment) + { + return "comment '" + comment + "'"; + } + + /// Does this dialect support column-level check constraints? + /// True if column-level CHECK constraints are supported; false otherwise. + public override bool SupportsColumnCheck => false; + + /// Does this dialect support table-level check constraints? + /// True if table-level CHECK constraints are supported; false otherwise. + public override bool SupportsTableCheck => true; + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new HanaDataBaseSchema(connection); + } + + #endregion + + #region Lock acquisition support + + /// Is FOR UPDATE OF syntax expecting columns? + /// if the database expects a column list with FOR UPDATE OF syntax, + /// if it expects table alias instead or do not support FOR UPDATE OF syntax. + // Since v5.1 + [Obsolete("Use UsesColumnsWithForUpdateOf instead")] + public override bool ForUpdateOfColumns => true; + + /// + /// Get the FOR UPDATE OF column_list fragment appropriate for this + /// dialect given the aliases of the columns to be write locked. + /// + /// The columns to be write locked. + /// The appropriate FOR UPDATE OF column_list clause string. + public override string GetForUpdateString(string aliases) + { + return ForUpdateString + " of " + aliases; + } + + /// + /// Retrieves the FOR UPDATE NOWAIT syntax specific to this dialect + /// + /// The appropriate FOR UPDATE NOWAIT clause string. + public override string ForUpdateNowaitString + { + get { return ForUpdateString + " nowait"; } + } + + /// + /// Get the FOR UPDATE OF column_list NOWAIT fragment appropriate + /// for this dialect given the aliases of the columns or tables to be write locked. + /// + /// The columns or tables to be write locked. + /// The appropriate FOR UPDATE colunm_or_table_list NOWAIT clause string. + public override string GetForUpdateNowaitString(string aliases) + { + return GetForUpdateString(aliases) + " nowait"; + } + + #endregion + + #region Table support + + #region Temporary table support + + /// Does this dialect support temporary tables? + public override bool SupportsTemporaryTables => true; + + /// Generate a temporary table name given the bas table. + /// The table name from which to base the temp table name. + /// The generated temp table name. + public override string GenerateTemporaryTableName(string baseTableName) + { + return "#HT_" + baseTableName; + } + + /// + /// Does the dialect require that temporary table DDL statements occur in + /// isolation from other statements? This would be the case if the creation + /// would cause any current transaction to get committed implicitly. + /// + /// see the result matrix above. + /// + /// JDBC defines a standard way to query for this information via the + /// {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()} + /// method. However, that does not distinguish between temporary table + /// DDL and other forms of DDL; MySQL, for example, reports DDL causing a + /// transaction commit via its driver, even though that is not the case for + /// temporary table DDL. + ///

+ /// Possible return values and their meanings:

    + ///
  • {@link Boolean#TRUE} - Unequivocally, perform the temporary table DDL in isolation.
  • + ///
  • {@link Boolean#FALSE} - Unequivocally, do not perform the temporary table DDL in isolation.
  • + ///
  • null - defer to the JDBC driver response in regards to {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()}
  • + ///
+ ///
+ public override bool? PerformTemporaryTableDDLInIsolation() + { + return false; + } + + /// Do we need to drop the temporary table after use? + public override bool DropTemporaryTableAfterUse() + { + return true; + } + + #endregion + + #endregion + + #region Callable statement support + + /// + /// Registers an OUT parameter which will be returning a + /// . How this is accomplished varies greatly + /// from DB to DB, hence its inclusion (along with {@link #getResultSet}) here. + /// + /// The callable statement. + /// The bind position at which to register the OUT param. + /// The number of (contiguous) bind positions used. + public override int RegisterResultSetOutParameter(DbCommand statement, int position) + { + // Result set (TABLE) OUT parameters don't need to be registered + return position; + } + + #endregion + + #region Current timestamp support + + /// Does this dialect support a way to retrieve the database's current timestamp value? + public override bool SupportsCurrentTimestampSelection => true; + + /// + /// Gives the best resolution that the database can use for storing + /// date/time values, in ticks. + /// + /// + /// + /// For example, if the database can store values with 100-nanosecond + /// precision, this property is equal to 1L. If the database can only + /// store values with 1-millisecond precision, this property is equal + /// to 10000L (number of ticks in a millisecond). + /// + /// + /// Used in TimestampType. + /// + /// + public override long TimestampResolutionInTicks + { + get { return 10L; } // Maximum precision (one tick) + } + + #endregion + + #region Constraint support + + + /// + /// Completely optional cascading drop clause + /// + public override string CascadeConstraintsString + { + get { return " cascade"; } + } + + #endregion + + #region Native identifier generation + + #region IDENTITY support + + /// + /// Does this dialect support identity column key generation? + /// + public override bool SupportsIdentityColumns => true; + + /// + /// Get the select command to use to retrieve the last generated IDENTITY + /// value for a particular table + /// + /// The table into which the insert was done + /// The PK column. + /// The type code. + /// The appropriate select command + public override string GetIdentitySelectString(string identityColumn, string tableName, DbType type) + { + return IdentitySelectString + tableName; + } + + /// + /// Get the select command to use to retrieve the last generated IDENTITY value. + /// + /// The appropriate select command + public override string IdentitySelectString + { + get { return "select current_identity_value() from "; } + } + + /// + /// The keyword used to specify an identity column, if native key generation is supported + /// + public override string IdentityColumnString + { + get { return "generated by default as identity"; } + } + + #endregion + + #region SEQUENCE support + + /// + /// Does this dialect support sequences? + /// + public override bool SupportsSequences => true; + + /// + /// Does this dialect support "pooled" sequences? + /// + /// True if such "pooled" sequences are supported; false otherwise. + /// + /// A pooled sequence is one that has a configurable initial size and increment + /// size. It enables NHibernate to be allocated a pool/block/range of IDs, + /// which can reduce the frequency of round trips to the database during ID + /// generation. + /// + /// + /// + public override bool SupportsPooledSequences => true; + + /// + /// Generate the appropriate select statement to to retreive the next value + /// of a sequence. + /// + /// the name of the sequence + /// String The "nextval" select string. + /// This should be a "stand alone" select statement. + public override string GetSequenceNextValString(string sequenceName) + { + return "select " + GetSelectSequenceNextValString(sequenceName) + " from dummy"; + } + + /// + /// Typically dialects which support sequences can drop a sequence + /// with a single command. + /// + /// The name of the sequence + /// The sequence drop commands + /// + /// This is convenience form of + /// to help facilitate that. + /// + /// Dialects which support sequences and can drop a sequence in a + /// single command need *only* override this method. Dialects + /// which support sequences but require multiple commands to drop + /// a sequence should instead override . + /// + public override string GetDropSequenceString(string sequenceName) + { + return "drop sequence " + sequenceName; + } + + /// + /// Generate the select expression fragment that will retrieve the next + /// value of a sequence as part of another (typically DML) statement. + /// + /// the name of the sequence + /// The "nextval" fragment. + /// + /// This differs from in that this + /// should return an expression usable within another statement. + /// + public override string GetSelectSequenceNextValString(string sequenceName) + { + return sequenceName + ".nextval"; + } + + /// + /// Typically dialects which support sequences can create a sequence + /// with a single command. + /// + /// The name of the sequence + /// The sequence creation command + /// + /// This is convenience form of to help facilitate that. + /// Dialects which support sequences and can create a sequence in a + /// single command need *only* override this method. Dialects + /// which support sequences but require multiple commands to create + /// a sequence should instead override . + /// + public override string GetCreateSequenceString(string sequenceName) + { + return "create sequence " + sequenceName; + } + + /// + /// Overloaded form of , additionally + /// taking the initial value and increment size to be applied to the sequence + /// definition. + /// + /// The name of the sequence + /// The initial value to apply to 'create sequence' statement + /// The increment value to apply to 'create sequence' statement + /// The sequence creation command + /// + /// The default definition is to suffix + /// with the string: " start with {initialValue} increment by {incrementSize}" where + /// {initialValue} and {incrementSize} are replacement placeholders. Generally + /// dialects should only need to override this method if different key phrases + /// are used to apply the allocation information. + /// + protected override string GetCreateSequenceString(string sequenceName, int initialValue, int incrementSize) + { + if (incrementSize == 0) + { + throw new MappingException("Unable to create the sequence [" + sequenceName + "]: the increment size must not be 0"); + } + + String createSequenceString = GetCreateSequenceString(sequenceName) + " start with " + initialValue + " increment by " + incrementSize; + if (incrementSize > 0) + { + if (initialValue < 1) + { + // default minvalue for an ascending sequence is 1 + createSequenceString += " minvalue " + initialValue; + } + } + else if (incrementSize < 0) + { + if (initialValue > -1) + { + // default maxvalue for a descending sequence is -1 + createSequenceString += " maxvalue " + initialValue; + } + } + return createSequenceString; + } + + /// Get the select command used retrieve the names of all sequences. + /// The select command; or null if sequences are not supported. + public override string QuerySequencesString + { + get { return "select sequence_name from sys.sequences"; } + } + + #endregion + + #endregion + + #region Miscellaneous support + + /// The SQL literal value to which this database maps boolean values. + /// The boolean value + /// The appropriate SQL literal. + public override string ToBooleanValueString(bool value) + { + return value ? "true" : "false"; + } + + /// + /// Does this dialect support concurrent writing connections in the same transaction? + /// + public override bool SupportsConcurrentWritingConnectionsInSameTransaction => false; + + #endregion + + #region Limit/offset support + + /// + /// Does this Dialect have some kind of LIMIT syntax? + /// + /// False, unless overridden. + public override bool SupportsLimit => true; + + /// + /// Attempts to add a LIMIT clause to the given SQL SELECT. + /// Expects any database-specific offset and limit adjustments to have already been performed (ex. UseMaxForLimit, OffsetStartsAtOne). + /// + /// The to base the limit query off. + /// Offset of the first row to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no limit is requested. This should have already been adjusted to account for OffsetStartsAtOne. + /// Maximum number of rows to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no offset is requested. This should have already been adjusted to account for UseMaxForLimit. + /// A new that contains the LIMIT clause. Returns null + /// if represents a SQL statement to which a limit clause cannot be added, + /// for example when the query string is custom SQL invoking a stored procedure. + public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit) + { + if (offset == null && limit == null) + { + return queryString; + } + + var limitBuilder = new SqlStringBuilder(queryString); + limitBuilder.Add(" limit "); + + if (limit == null) + { + limitBuilder.Add(uint.MaxValue.ToString()); + } + else + { + limitBuilder.Add(limit); + } + + if (offset != null) + { + limitBuilder.Add(" offset "); + limitBuilder.Add(offset); + } + + return limitBuilder.ToSqlString(); + } + + #endregion + + #region Identifier quoting support + + #endregion + + #region Union subclass support + + /// + /// Given a type code, determine an appropriate + /// null value to use in a select clause. + /// + /// The type code. + /// The appropriate select clause value fragment. + /// + /// One thing to consider here is that certain databases might + /// require proper casting for the nulls here since the select here + /// will be part of a UNION/UNION ALL. + /// + public override string GetSelectClauseNullString(SqlType sqlType) + { + switch (sqlType.DbType) + { + case DbType.AnsiString: + case DbType.AnsiStringFixedLength: + case DbType.Guid: + return "to_varchar(null)"; + case DbType.Binary: + return "to_binary(null)"; + case DbType.Boolean: + return "cast(null as boolean)"; + case DbType.Byte: + return "to_tinyint(null)"; + case DbType.Currency: + case DbType.Decimal: + return "to_decimal(null)"; + case DbType.Date: + return "to_date(null)"; + case DbType.DateTime: + return "to_timestamp(null)"; + case DbType.Double: + return "to_double(null)"; + case DbType.Int16: + case DbType.SByte: + return "to_smallint(null)"; + case DbType.Int32: + return "to_integer(null)"; + case DbType.Int64: + return "to_bigint(null)"; + case DbType.Single: + return "to_real(null)"; + case DbType.String: + case DbType.StringFixedLength: + return "to_nvarchar(null)"; + case DbType.Time: + return "to_time(null)"; + } + return "null"; + } + + /// + /// Does this dialect support UNION ALL, which is generally a faster variant of UNION? + /// True if UNION ALL is supported; false otherwise. + /// + public override bool SupportsUnionAll => true; + + #endregion + + #region Informational metadata + + /// + /// Does this dialect support empty IN lists? + /// For example, is [where XYZ in ()] a supported construct? + /// + /// True if empty in lists are supported; false otherwise. + public override bool SupportsEmptyInList => false; + + /// + /// Is this dialect known to support what ANSI-SQL terms "row value + /// constructor" syntax; sometimes called tuple syntax. + ///

+ /// Basically, does it support syntax like + /// "... where (FIRST_NAME, LAST_NAME) = ('Steve', 'Ebersole') ...". + ///

+ /// + /// True if this SQL dialect is known to support "row value + /// constructor" syntax; false otherwise. + /// + public override bool SupportsRowValueConstructorSyntax => true; + + /// + /// If the dialect supports {@link #supportsRowValueConstructorSyntax() row values}, + /// does it offer such support in IN lists as well? + ///

+ /// For example, "... where (FIRST_NAME, LAST_NAME) IN ( (?, ?), (?, ?) ) ..." + ///

+ /// + /// True if this SQL dialect is known to support "row value + /// constructor" syntax in the IN list; false otherwise. + /// + public override bool SupportsRowValueConstructorSyntaxInInList => true; + + /// + /// Does this dialect support definition of cascade delete constraints + /// which can cause circular chains? + /// + /// True if circular cascade delete constraints are supported; false otherwise. + public override bool SupportsCircularCascadeDeleteConstraints => false; + + /// + /// Expected LOB usage pattern is such that I can perform an insert + /// via prepared statement with a parameter binding for a LOB value + /// without crazy casting to JDBC driver implementation-specific classes... + ///

+ /// Part of the trickiness here is the fact that this is largely + /// driver dependent. For example, Oracle (which is notoriously bad with + /// LOB support in their drivers historically) actually does a pretty good + /// job with LOB support as of the 10.2.x versions of their drivers... + ///

+ /// + /// True if normal LOB usage patterns can be used with this driver; + /// false if driver-specific hookiness needs to be applied. + /// + public override bool SupportsExpectedLobUsagePattern => false; + + /// + /// Is it supported to materialize a LOB locator outside the transaction in + /// which it was created? + ///

+ /// Again, part of the trickiness here is the fact that this is largely + /// driver dependent. + ///

+ /// NOTE: all database I have tested which {@link #supportsExpectedLobUsagePattern()} + /// also support the ability to materialize a LOB outside the owning transaction... + ///

+ /// True if unbounded materialization is supported; false otherwise. + public override bool SupportsUnboundedLobLocatorMaterialization => false; + + /// Does the dialect support an exists statement in the select clause? + /// True if exists checks are allowed in the select clause; false otherwise. + public override bool SupportsExistsInSelect => false; + + /// + /// Does this dialect support scalar sub-selects? + /// + /// + /// Scalar sub-selects are sub-queries returning a scalar value, not a set. See https://stackoverflow.com/a/648049/1178314 + /// + public override bool SupportsScalarSubSelects => false; + + #endregion + + + /// + /// Get the command used to select a GUID from the underlying database. + /// (Optional operation.) + /// + /// The appropriate command. + public override string SelectGUIDString + { + get { return "select sysuuid from dummy"; } + } + + /// + /// Should the value returned by + /// be treated as callable. Typically this indicates that JDBC escape + /// syntax is being used... + /// + public override bool IsCurrentTimestampSelectStringCallable => false; + + /// + /// Retrieve the command used to retrieve the current timestammp from the database. + /// + public override string CurrentTimestampSelectString + { + get { return "select current_timestamp from dummy"; } + } + + /// + /// The keyword used to insert a row without specifying any column values + /// + public override string NoColumnsInsertString + { + get { throw new MappingException("HANA does not support inserting a row without specifying any column values"); } + } + + // 18 is the smallest of all dialects we handle. + /// + /// The maximum length a SQL alias can have. + /// + public override int MaxAliasLength => 128; + + /// + /// The syntax used to add a column to a table. Note this is deprecated + /// + public override string AddColumnString + { + get { return "add ("; } + } + + /// + /// The syntax for the suffix used to add a column to a table. Note this is deprecated + /// + public override string AddColumnSuffixString + { + get { return ")"; } + } + } +} diff --git a/src/NHibernate/Dialect/Dialect.cs b/src/NHibernate/Dialect/Dialect.cs index 7cf2a77d7e2..ce895098065 100644 --- a/src/NHibernate/Dialect/Dialect.cs +++ b/src/NHibernate/Dialect/Dialect.cs @@ -2480,6 +2480,14 @@ public virtual string AddColumnString get { throw new NotSupportedException("No add column syntax supported by Dialect"); } } + /// + /// The syntax for the suffix used to add a column to a table. Note this is deprecated + /// + public virtual string AddColumnSuffixString + { + get { return String.Empty; } + } + public virtual string DropForeignKeyString { get { return " drop constraint "; } diff --git a/src/NHibernate/Dialect/Function/SQLFunctionTemplate.cs b/src/NHibernate/Dialect/Function/SQLFunctionTemplate.cs index 0c2c9156ea2..976a5f0e127 100644 --- a/src/NHibernate/Dialect/Function/SQLFunctionTemplate.cs +++ b/src/NHibernate/Dialect/Function/SQLFunctionTemplate.cs @@ -101,7 +101,7 @@ public bool HasParenthesesIfNoArguments /// args function arguments /// generated SQL function call /// - public SqlString Render(IList args, ISessionFactoryImplementor factory) + public virtual SqlString Render(IList args, ISessionFactoryImplementor factory) { SqlStringBuilder buf = new SqlStringBuilder(); foreach (TemplateChunk tc in chunks) diff --git a/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs b/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs new file mode 100644 index 00000000000..544eb51fd8c --- /dev/null +++ b/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; +using System.Linq; +using NHibernate.Engine; +using NHibernate.SqlCommand; +using NHibernate.Type; +using System; + +namespace NHibernate.Dialect.Function +{ + /// + /// Represents HQL functions that can have different representations in different SQL dialects. + /// E.g. in HQL we can define function concat(?1, ?2) to concatenate two strings + /// p1 and p2. Target SQL function will be dialect-specific, e.g. (?1 || ?2) for + /// Oracle, concat(?1, ?2) for MySql, (?1 + ?2) for MS SQL. + /// Each dialect will define a template as a string (exactly like above) marking function + /// parameters with '?' followed by parameter's index (first index is 1). + /// + [Serializable] + public class SQLFunctionTemplateWithRequiredParameters : SQLFunctionTemplate + { + private readonly object[] _requiredArgs; + + public SQLFunctionTemplateWithRequiredParameters(IType type, string template, object[] requiredArgs) : base(type, template) + { + _requiredArgs = requiredArgs; + } + + public override SqlString Render(IList args, ISessionFactoryImplementor factory) + { + var combinedArgs = + args.Cast() + .Concat(_requiredArgs.Skip(args.Count)) + .ToArray(); + return base.Render(combinedArgs, factory); + } + } +} diff --git a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs new file mode 100644 index 00000000000..a9d980ae548 --- /dev/null +++ b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs @@ -0,0 +1,48 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; +using NHibernate.SqlCommand; +using NHibernate.SqlTypes; +using NHibernate.Util; +using Environment = NHibernate.Cfg.Environment; + +namespace NHibernate.Dialect +{ + /// + /// A SQL dialect for the SAP HANA column store + /// + /// + /// The HanaColumnStoreDialect defaults the following configuration properties: + /// + /// + /// Property + /// Default Value + /// + /// + /// connection.driver_class + /// + /// + /// + /// + public class HanaColumnStoreDialect : AbstractHanaDialect + { + public HanaColumnStoreDialect() + { + } + + /// Command used to create a table. + public override string CreateTableString + { + get { return "create column table"; } + } + + /// Command used to create a temporary table. + public override string CreateTemporaryTableString + { + get { return "create local temporary column table"; } + } + } +} diff --git a/src/NHibernate/Dialect/HanaRowStoreDialect.cs b/src/NHibernate/Dialect/HanaRowStoreDialect.cs new file mode 100644 index 00000000000..c9319c394c7 --- /dev/null +++ b/src/NHibernate/Dialect/HanaRowStoreDialect.cs @@ -0,0 +1,48 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; +using NHibernate.SqlCommand; +using NHibernate.SqlTypes; +using NHibernate.Util; +using Environment = NHibernate.Cfg.Environment; + +namespace NHibernate.Dialect +{ + /// + /// A SQL dialect for the SAP HANA row store + /// + /// + /// The HanaColumnStoreDialect defaults the following configuration properties: + /// + /// + /// Property + /// Default Value + /// + /// + /// connection.driver_class + /// + /// + /// + /// + public class HanaRowStoreDialect : AbstractHanaDialect + { + public HanaRowStoreDialect() + { + } + + /// Command used to create a table. + public override string CreateTableString + { + get { return "create row table"; } + } + + /// Command used to create a temporary table. + public override string CreateTemporaryTableString + { + get { return "create local temporary row table"; } + } + } +} diff --git a/src/NHibernate/Dialect/Schema/HanaMetaData.cs b/src/NHibernate/Dialect/Schema/HanaMetaData.cs new file mode 100644 index 00000000000..6c295d5630e --- /dev/null +++ b/src/NHibernate/Dialect/Schema/HanaMetaData.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; + +namespace NHibernate.Dialect.Schema +{ + public class HanaDataBaseSchema : AbstractDataBaseSchema + { + public HanaDataBaseSchema(DbConnection connection) : base(connection) + { + } + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new HanaTableMetadata(rs, this, extras); + } + + public override ISet GetReservedWords() + { + var result = new HashSet(StringComparer.OrdinalIgnoreCase); + DataTable dtReservedWords = Connection.GetSchema(DbMetaDataCollectionNames.ReservedWords); + foreach (DataRow row in dtReservedWords.Rows) + { + result.Add(row["reserved_word"].ToString()); + } + + if (IncludeDataTypesInReservedWords) + { + DataTable dtTypes = Connection.GetSchema(DbMetaDataCollectionNames.DataTypes); + foreach (DataRow row in dtTypes.Rows) + { + result.Add(row["TypeName"].ToString()); + } + } + + return result; + } + + public override DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Tables", restrictions); + return objTbl; + } + + public override DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) + { + var restrictions = new[] {schemaPattern, tableName, null}; + DataTable objTbl = Connection.GetSchema("Indexes", restrictions); + return objTbl; + } + + public override DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) + { + var restrictions = new[] {schemaPattern, tableName, indexName, null}; + DataTable objTbl = Connection.GetSchema("IndexColumns", restrictions); + return objTbl; + } + + public override DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, + string columnNamePattern) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Columns", restrictions); + return objTbl; + } + + public override DataTable GetForeignKeys(string catalog, string schema, string table) + { + var restrictions = new[] {schema, table, null}; + DataTable objTbl = Connection.GetSchema("ForeignKeys", restrictions); + return objTbl; + } + + public override bool StoresUpperCaseIdentifiers + { + get { return true; } + } + } + + public class HanaTableMetadata : AbstractTableMetadata + { + public HanaTableMetadata(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) + { + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = null; + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Schema)) Schema = null; + Name = Convert.ToString(rs["TABLE_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + return Convert.ToString(rs["CONSTRAINT_NAME"]); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetIndexName(DataRow rs) + { + return Convert.ToString(rs["INDEX_NAME"]); + } + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new HanaColumnMetadata(rs); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new HanaForeignKeyMetadata(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new HanaIndexMetadata(rs); + } + } + + public class HanaColumnMetadata : AbstractColumnMetaData + { + public HanaColumnMetadata(DataRow rs) + : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + + this.SetColumnSize(rs["CHARACTER_MAXIMUM_LENGTH"]); + this.SetNumericalPrecision(rs["NUMERIC_PRECISION"]); + + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class HanaIndexMetadata : AbstractIndexMetadata + { + public HanaIndexMetadata(DataRow rs) + : base(rs) + { + Name = Convert.ToString(rs["INDEX_NAME"]); + } + } + + public class HanaForeignKeyMetadata : AbstractForeignKeyMetadata + { + public HanaForeignKeyMetadata(DataRow rs) + : base(rs) + { + Name = Convert.ToString(rs["CONSTRAINT_NAME"]); + } + } +} diff --git a/src/NHibernate/Driver/HanaDriver.cs b/src/NHibernate/Driver/HanaDriver.cs new file mode 100644 index 00000000000..4738043db21 --- /dev/null +++ b/src/NHibernate/Driver/HanaDriver.cs @@ -0,0 +1,81 @@ +using NHibernate.AdoNet; + +namespace NHibernate.Driver +{ + /// + /// Provides a database driver for SAP HANA. + /// + /// + /// + /// In order to use this driver you must have the assembly Sap.Data.Hana.dll available for + /// NHibernate to load, including its dependencies (libadonetHDB.dll and libSQLDBCHDB.dll + /// are required by the assembly Sap.Data.Hana.dll as of the time of this writing). + /// + /// + /// Please check the product's website + /// for any updates and/or documentation regarding SAP HANA. + /// + /// + public class HanaDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Thrown when the Sap.Data.Hana assembly can not be loaded. + /// + public HanaDriver() : base( + "Sap.Data.Hana", + "Sap.Data.Hana.v4.5", + "Sap.Data.Hana.HanaConnection", + "Sap.Data.Hana.HanaCommand") + { + } + + /// + /// Does this Driver require the use of a Named Prefix in the SQL statement. + /// + /// + /// For example, SqlClient requires select * from simple where simple_id = @simple_id + /// If this is false, like with the OleDb provider, then it is assumed that + /// the ? can be a placeholder for the parameter in the SQL statement. + /// + public override bool UseNamedPrefixInSql => false; + + /// + /// Does this Driver require the use of the Named Prefix when trying + /// to reference the Parameter in the Command's Parameter collection. + /// + /// + /// This is really only useful when the UseNamedPrefixInSql == true. When this is true the + /// code will look like: + /// DbParameter param = cmd.Parameters["@paramName"] + /// if this is false the code will be + /// DbParameter param = cmd.Parameters["paramName"]. + /// + public override bool UseNamedPrefixInParameter => false; + + /// + /// The Named Prefix for parameters. + /// + /// + /// Sql Server uses "@" and Oracle uses ":". + /// + public override string NamedPrefix => null; + + public override bool SupportsMultipleOpenReaders => true; + + public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) + { + return new BasicResultSetsCommand(session); + } + + public override bool SupportsSystemTransactions => false; + + public override bool SupportsNullEnlistment => false; + + public override bool RequiresTimeSpanForTime => true; + + System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(NonBatchingBatcherFactory); + } +} diff --git a/src/NHibernate/Mapping/Table.cs b/src/NHibernate/Mapping/Table.cs index 6e84c3f6965..c61ac35cec0 100644 --- a/src/NHibernate/Mapping/Table.cs +++ b/src/NHibernate/Mapping/Table.cs @@ -686,6 +686,7 @@ public string[] SqlAlterStrings(Dialect.Dialect dialect, IMapping p, ITableMetad alter.Append(dialect.GetColumnComment(columnComment)); } + alter.Append(dialect.AddColumnSuffixString); results.Add(alter.ToString()); } From 34a46e36f594ba76d36ad5ac9c0f660599924420 Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Thu, 12 Apr 2018 16:53:50 +0200 Subject: [PATCH 02/12] Add SAP HANA batcher --- src/NHibernate/AdoNet/HanaBatchingBatcher.cs | 173 ++++++++++++++++++ .../AdoNet/HanaBatchingBatcherFactory.cs | 12 ++ .../Async/AdoNet/HanaBatchingBatcher.cs | 120 ++++++++++++ src/NHibernate/Driver/HanaDriver.cs | 13 +- 4 files changed, 314 insertions(+), 4 deletions(-) create mode 100644 src/NHibernate/AdoNet/HanaBatchingBatcher.cs create mode 100644 src/NHibernate/AdoNet/HanaBatchingBatcherFactory.cs create mode 100644 src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs diff --git a/src/NHibernate/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs new file mode 100644 index 00000000000..24dfd4f4dd2 --- /dev/null +++ b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; +using System.Text; +using NHibernate.AdoNet.Util; +using NHibernate.Exceptions; + +namespace NHibernate.AdoNet +{ + /// + /// Summary description for HanaBatchingBatcher. + /// By Jonathan Bregler + /// + public partial class HanaBatchingBatcher : AbstractBatcher + { + private int _batchSize; + private int _countOfCommands; + private int _totalExpectedRowsAffected; + private DbCommand _currentBatch; + private readonly IList _currentBatchCommands = new List(); + private StringBuilder _currentBatchCommandsLog; + + public HanaBatchingBatcher(ConnectionManager connectionManager, IInterceptor interceptor) + : base(connectionManager, interceptor) + { + _batchSize = Factory.Settings.AdoBatchSize; + //we always create this, because we need to deal with a scenario in which + //the user change the logging configuration at runtime. Trying to put this + //behind an if(log.IsDebugEnabled) will cause a null reference exception + //at that point. + _currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:"); + } + + public override void AddToBatch(IExpectation expectation) + { + Debug.Assert(CurrentCommand is ICloneable); // HanaCommands are cloneable + + var batchUpdate = CurrentCommand; + Prepare(batchUpdate); + Driver.AdjustCommand(batchUpdate); + + _totalExpectedRowsAffected += expectation.ExpectedRowCount; + string lineWithParameters = null; + var sqlStatementLogger = Factory.Settings.SqlStatementLogger; + if (sqlStatementLogger.IsDebugEnabled || Log.IsDebugEnabled()) + { + lineWithParameters = sqlStatementLogger.GetCommandLineWithParameters(batchUpdate); + var formatStyle = sqlStatementLogger.DetermineActualStyle(FormatStyle.Basic); + lineWithParameters = formatStyle.Formatter.Format(lineWithParameters); + _currentBatchCommandsLog.Append("command ") + .Append(_countOfCommands) + .Append(":") + .AppendLine(lineWithParameters); + } + if (Log.IsDebugEnabled()) + { + Log.Debug("Adding to batch:{0}", lineWithParameters); + } + + if (_currentBatch == null) + { + // use first command as the batching command + _currentBatch = (batchUpdate as ICloneable).Clone() as DbCommand; + } + + _currentBatchCommands.Add((batchUpdate as ICloneable).Clone() as DbCommand); + + _countOfCommands++; + + if (_countOfCommands >= _batchSize) + { + DoExecuteBatch(batchUpdate); + } + } + + protected override void DoExecuteBatch(DbCommand ps) + { + Log.Info("Executing batch"); + CheckReaders(); + + if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) + { + Factory.Settings.SqlStatementLogger.LogBatchCommand(_currentBatchCommandsLog.ToString()); + _currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:"); + } + + try + { + int rowCount = 0; + + if (_countOfCommands > 0) + { + _currentBatch.Parameters.Clear(); + + foreach (var command in _currentBatchCommands) + { + foreach (DbParameter parameter in command.Parameters) + { + _currentBatch.Parameters.Add(parameter); + } + } + + _currentBatch.Prepare(); + + try + { + rowCount = _currentBatch.ExecuteNonQuery(); + } + catch (DbException e) + { + throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, e, "could not execute batch command."); + } + } + + Expectations.VerifyOutcomeBatched(_totalExpectedRowsAffected, rowCount); + } + finally + { + // Cleaning up even if batched outcome is invalid + _totalExpectedRowsAffected = 0; + _countOfCommands = 0; + CloseBatchCommands(); + } + } + + protected override int CountOfStatementsInCurrentBatch + { + get { return _countOfCommands; } + } + + public override int BatchSize + { + get { return _batchSize; } + set { _batchSize = value; } + } + + public override void CloseCommands() + { + base.CloseCommands(); + + CloseBatchCommands(); + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + + CloseBatchCommands(); + } + + private void CloseBatchCommands() + { + try + { + foreach (var currentBatchCommand in _currentBatchCommands) + { + currentBatchCommand.Dispose(); + } + _currentBatchCommands.Clear(); + + _currentBatch?.Dispose(); + _currentBatch = null; + } + catch (Exception e) + { + // Prevent exceptions when clearing the batch from hiding any original exception + // (We do not know here if this batch closing occurs after a failure or not.) + Log.Warn(e, "Exception clearing batch"); + } + } + } +} diff --git a/src/NHibernate/AdoNet/HanaBatchingBatcherFactory.cs b/src/NHibernate/AdoNet/HanaBatchingBatcherFactory.cs new file mode 100644 index 00000000000..613fc4bcd54 --- /dev/null +++ b/src/NHibernate/AdoNet/HanaBatchingBatcherFactory.cs @@ -0,0 +1,12 @@ +using NHibernate.Engine; + +namespace NHibernate.AdoNet +{ + public class HanaBatchingBatcherFactory : IBatcherFactory + { + public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor) + { + return new HanaBatchingBatcher(connectionManager, interceptor); + } + } +} diff --git a/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs new file mode 100644 index 00000000000..957e29f070b --- /dev/null +++ b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; +using System.Text; +using NHibernate.AdoNet.Util; +using NHibernate.Exceptions; + +namespace NHibernate.AdoNet +{ + using System.Threading.Tasks; + using System.Threading; + public partial class HanaBatchingBatcher : AbstractBatcher + { + + public override async Task AddToBatchAsync(IExpectation expectation, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + Debug.Assert(CurrentCommand is ICloneable); // HanaCommands are cloneable + + var batchUpdate = CurrentCommand; + await (PrepareAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); + Driver.AdjustCommand(batchUpdate); + + _totalExpectedRowsAffected += expectation.ExpectedRowCount; + string lineWithParameters = null; + var sqlStatementLogger = Factory.Settings.SqlStatementLogger; + if (sqlStatementLogger.IsDebugEnabled || Log.IsDebugEnabled()) + { + lineWithParameters = sqlStatementLogger.GetCommandLineWithParameters(batchUpdate); + var formatStyle = sqlStatementLogger.DetermineActualStyle(FormatStyle.Basic); + lineWithParameters = formatStyle.Formatter.Format(lineWithParameters); + _currentBatchCommandsLog.Append("command ") + .Append(_countOfCommands) + .Append(":") + .AppendLine(lineWithParameters); + } + if (Log.IsDebugEnabled()) + { + Log.Debug("Adding to batch:{0}", lineWithParameters); + } + + if (_currentBatch == null) + { + // use first command as the batching command + _currentBatch = (batchUpdate as ICloneable).Clone() as DbCommand; + } + + _currentBatchCommands.Add((batchUpdate as ICloneable).Clone() as DbCommand); + + _countOfCommands++; + + if (_countOfCommands >= _batchSize) + { + await (DoExecuteBatchAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); + } + } + + protected override async Task DoExecuteBatchAsync(DbCommand ps, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + Log.Info("Executing batch"); + await (CheckReadersAsync(cancellationToken)).ConfigureAwait(false); + + if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) + { + Factory.Settings.SqlStatementLogger.LogBatchCommand(_currentBatchCommandsLog.ToString()); + _currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:"); + } + + try + { + int rowCount = 0; + + if (_countOfCommands > 0) + { + _currentBatch.Parameters.Clear(); + + foreach (var command in _currentBatchCommands) + { + foreach (DbParameter parameter in command.Parameters) + { + _currentBatch.Parameters.Add(parameter); + } + } + + _currentBatch.Prepare(); + + try + { + rowCount = await (_currentBatch.ExecuteNonQueryAsync(cancellationToken)).ConfigureAwait(false); + } + catch (DbException e) + { + throw ADOExceptionHelper.Convert(Factory.SQLExceptionConverter, e, "could not execute batch command."); + } + } + + Expectations.VerifyOutcomeBatched(_totalExpectedRowsAffected, rowCount); + } + finally + { + // Cleaning up even if batched outcome is invalid + _totalExpectedRowsAffected = 0; + _countOfCommands = 0; + CloseBatchCommands(); + } + } + } +} diff --git a/src/NHibernate/Driver/HanaDriver.cs b/src/NHibernate/Driver/HanaDriver.cs index 4738043db21..9e0a82db64e 100644 --- a/src/NHibernate/Driver/HanaDriver.cs +++ b/src/NHibernate/Driver/HanaDriver.cs @@ -1,3 +1,4 @@ +using System; using NHibernate.AdoNet; namespace NHibernate.Driver @@ -61,21 +62,25 @@ public HanaDriver() : base( /// /// Sql Server uses "@" and Oracle uses ":". /// - public override string NamedPrefix => null; + public override string NamedPrefix => String.Empty; - public override bool SupportsMultipleOpenReaders => true; + public override bool SupportsMultipleOpenReaders => false; public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) { return new BasicResultSetsCommand(session); } - public override bool SupportsSystemTransactions => false; + public override bool SupportsSystemTransactions => true; public override bool SupportsNullEnlistment => false; public override bool RequiresTimeSpanForTime => true; - System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(NonBatchingBatcherFactory); + public override bool HasDelayedDistributedTransactionCompletion => false; + + public override bool SupportsEnlistmentWhenAutoEnlistmentIsDisabled => false; + + System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(HanaBatchingBatcherFactory); } } From d5969ce469e5a5a294939fd09c0e7161b6c3c809 Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Mon, 16 Apr 2018 13:29:57 +0200 Subject: [PATCH 03/12] Minor fixes addressing PR comments for SAP HANA support - Replace explicit check for AbstractHanaDialect with TestDialect.SupportsEmptyInserts where applicable - Replace copied base class documentation with - Add constructor SQLFunctionTemplateWithRequiredParameters(IType, string, object[], bool) - Improve documentation of SQLFunctionTemplateWithRequiredParameters - Removed deprecation comments from Dialect#AddColumnString and Dialect#AddColumnSuffixString --- .../Lambda/FunctionsIntegrationFixture.cs | 2 +- .../Criteria/Lambda/IntegrationFixture.cs | 2 +- .../Lambda/ProjectIntegrationFixture.cs | 2 +- .../Lambda/SimpleIntegrationFixture.cs | 2 +- .../Lambda/SubQueryIntegrationFixture.cs | 2 +- .../AbstractCollectionEventFixture.cs | 2 +- .../Async/GenericTest/Overall/Fixture.cs | 2 +- .../Async/Legacy/FooBarTest.cs | 2 +- src/NHibernate.Test/Async/Legacy/FumTest.cs | 2 +- .../Async/Legacy/MasterDetailTest.cs | 2 +- .../Async/Legacy/MultiTableTest.cs | 4 +- .../Async/Legacy/ParentChildTest.cs | 2 +- .../Async/NHSpecificTest/CollectionFixture.cs | 2 +- .../Docs/Associations/BiM21/Fixture.cs | 2 +- .../Docs/ExampleParentChild/UpdateFixture.cs | 2 +- .../GH1565/LockEntityWithOuterJoinTest.cs | 2 +- .../Async/NHSpecificTest/LazyLoadBugTest.cs | 2 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 4 +- .../LoadingNullEntityInSet/Fixture.cs | 4 +- .../Async/NHSpecificTest/NH1301/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1388/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1601/Fixture1.cs | 4 +- .../Async/NHSpecificTest/NH1601/Fixture2.cs | 4 +- .../Async/NHSpecificTest/NH1609/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1691/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1869/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH1914/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH2328/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH2409/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH2703/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH2705/Test.cs | 2 +- .../Async/NHSpecificTest/NH3050/Fixture.cs | 2 +- .../NHSpecificTest/NH3141/ProxyIdFixture.cs | 2 +- .../Async/NHSpecificTest/NH315/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH386/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH440/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH473/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH479/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH521/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH607/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH643/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH687/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH704/Fixture.cs | 2 +- .../Async/NHSpecificTest/NH826/Fixture.cs | 2 +- .../NH830/AutoFlushTestFixture.cs | 2 +- .../NHSpecificTest/NH898/NH898Fixture.cs | 2 +- .../SqlConverterAndMultiQuery/Fixture.cs | 2 +- .../Async/Operations/MergeFixture.cs | 2 +- .../Stateless/StatelessSessionQueryFixture.cs | 2 +- .../Lambda/FunctionsIntegrationFixture.cs | 2 +- .../Criteria/Lambda/IntegrationFixture.cs | 2 +- .../Lambda/ProjectIntegrationFixture.cs | 2 +- .../Lambda/SimpleIntegrationFixture.cs | 2 +- .../Lambda/SubQueryIntegrationFixture.cs | 2 +- .../AbstractCollectionEventFixture.cs | 2 +- .../GenericTest/Overall/Fixture.cs | 2 +- src/NHibernate.Test/Legacy/FooBarTest.cs | 2 +- src/NHibernate.Test/Legacy/FumTest.cs | 2 +- .../Legacy/MasterDetailTest.cs | 2 +- src/NHibernate.Test/Legacy/MultiTableTest.cs | 4 +- src/NHibernate.Test/Legacy/ParentChildTest.cs | 2 +- .../NHSpecificTest/CollectionFixture.cs | 2 +- .../Docs/Associations/BiM21/Fixture.cs | 2 +- .../Docs/ExampleParentChild/UpdateFixture.cs | 2 +- .../GH1565/LockEntityWithOuterJoinTest.cs | 2 +- .../NHSpecificTest/LazyLoadBugTest.cs | 2 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 4 +- .../LoadingNullEntityInSet/Fixture.cs | 4 +- .../NHSpecificTest/NH1301/Fixture.cs | 2 +- .../NHSpecificTest/NH1388/Fixture.cs | 2 +- .../NHSpecificTest/NH1601/Fixture1.cs | 4 +- .../NHSpecificTest/NH1601/Fixture2.cs | 4 +- .../NHSpecificTest/NH1609/Fixture.cs | 2 +- .../NHSpecificTest/NH1691/Fixture.cs | 2 +- .../NHSpecificTest/NH1869/Fixture.cs | 2 +- .../NHSpecificTest/NH1914/Fixture.cs | 2 +- .../NHSpecificTest/NH2328/Fixture.cs | 2 +- .../NHSpecificTest/NH2409/Fixture.cs | 2 +- .../NHSpecificTest/NH2703/Fixture.cs | 2 +- .../NHSpecificTest/NH2705/Test.cs | 2 +- .../NHSpecificTest/NH3050/Fixture.cs | 2 +- .../NHSpecificTest/NH3141/ProxyIdFixture.cs | 2 +- .../NHSpecificTest/NH315/Fixture.cs | 2 +- .../NHSpecificTest/NH386/Fixture.cs | 2 +- .../NHSpecificTest/NH440/Fixture.cs | 2 +- .../NHSpecificTest/NH473/Fixture.cs | 2 +- .../NHSpecificTest/NH479/Fixture.cs | 2 +- .../NHSpecificTest/NH521/Fixture.cs | 2 +- .../NHSpecificTest/NH607/Fixture.cs | 2 +- .../NHSpecificTest/NH643/Fixture.cs | 2 +- .../NHSpecificTest/NH687/Fixture.cs | 2 +- .../NHSpecificTest/NH704/Fixture.cs | 2 +- .../NHSpecificTest/NH826/Fixture.cs | 2 +- .../NH830/AutoFlushTestFixture.cs | 2 +- .../NHSpecificTest/NH898/NH898Fixture.cs | 2 +- .../SqlConverterAndMultiQuery/Fixture.cs | 2 +- .../Operations/MergeFixture.cs | 2 +- .../Stateless/StatelessSessionQueryFixture.cs | 2 +- src/NHibernate/Dialect/AbstractHanaDialect.cs | 352 +++--------------- src/NHibernate/Dialect/Dialect.cs | 4 +- ...LFunctionTemplateWithRequiredParameters.cs | 12 +- .../Dialect/HanaColumnStoreDialect.cs | 4 +- src/NHibernate/Dialect/HanaRowStoreDialect.cs | 4 +- src/NHibernate/Driver/HanaDriver.cs | 35 +- 104 files changed, 176 insertions(+), 451 deletions(-) diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs index c4d2937588c..aa90ddf80f3 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -22,7 +22,7 @@ public class FunctionsIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly => "NHibernate.Test"; diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs index 8de80b4e062..7654e7ee846 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs @@ -27,7 +27,7 @@ public class IntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly { get { return "NHibernate.Test"; } } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs index 31d784ad5be..bfdcfb7a6d4 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -23,7 +23,7 @@ public class ProjectIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs index 575ed161994..9ed1bbed62d 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -20,7 +20,7 @@ public class SimpleIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs index 873beed79ff..06389178ddb 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -22,7 +22,7 @@ public class SubQueryIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs index f6c654be8d4..34b9d794a1a 100644 --- a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs @@ -26,7 +26,7 @@ public abstract class AbstractCollectionEventFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs index e73b81220dc..1c99da13610 100644 --- a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs @@ -22,7 +22,7 @@ public class FixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index efe528993f8..75728192992 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -44,7 +44,7 @@ private static byte[] GetBytes(string str) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/FumTest.cs b/src/NHibernate.Test/Async/Legacy/FumTest.cs index 67ed75ccf75..642d243eda0 100644 --- a/src/NHibernate.Test/Async/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FumTest.cs @@ -32,7 +32,7 @@ public class FumTestAsync : TestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs index df2b4203b7b..132f86b0040 100644 --- a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs @@ -32,7 +32,7 @@ public class MasterDetailTestAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs index cfd571e92d1..d54b495f380 100644 --- a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs @@ -612,9 +612,9 @@ public async Task MultiTableNativeIdAsync() [Test] public async Task CollectionAsync() { - if (Dialect is AbstractHanaDialect) + if (!TestDialect.SupportsEmptyInserts) { - Assert.Ignore("HANA does not support inserting a row without specifying any column values"); + Assert.Ignore("Empty inserts are not supported by the current dialect."); } ISession s = OpenSession(); diff --git a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs index a0477f34e7b..59ecb8464ce 100644 --- a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs @@ -26,7 +26,7 @@ public class ParentChildTestAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs index 40b99e2800e..87c586e83a1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs @@ -39,7 +39,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index d4f9e977903..f2976a538a1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -31,7 +31,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index 0da54d38115..7c108940033 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -31,7 +31,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index 5a5b77f55f1..232dfd5c609 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -59,7 +59,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } } } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs index 8be9ec6c8ef..093497e70b3 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs @@ -27,7 +27,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs index 55a8b07ffd3..746aa0fcbf8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -27,8 +27,8 @@ public class FixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } protected override IList Mappings { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index 06055988d00..aa0d44cba9e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -36,8 +36,8 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } protected override DebugSessionFactory BuildSessionFactory() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs index 64dc5c76bd3..8e141323d6e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs @@ -24,7 +24,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs index 580c7d2c535..13c01a49975 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs @@ -21,7 +21,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs index 16235977fb5..066cfc2e94f 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs @@ -21,8 +21,8 @@ public class Fixture1Async : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } /// /// Loads the project do not call Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs index aa7dbb075d8..79d7934eb0f 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs @@ -21,8 +21,8 @@ public class Fixture2Async : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } /// /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs index 0a4343d4a28..8fe5277d66e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs @@ -28,7 +28,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs index 6cf0b96aa51..0070be19a8b 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs @@ -20,7 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private static Component GetInitializedComponent() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs index 579c2c9672b..8d18cc1dba1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs @@ -29,7 +29,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs index f630adf5985..9d93c5e3b34 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs @@ -21,7 +21,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs index 97db600f260..9c02f320451 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs @@ -21,7 +21,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs index c27db3165c6..064c36d9900 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs @@ -23,7 +23,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs index 6e0ae5e2849..1e758a4754c 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs @@ -21,7 +21,7 @@ public class FixtureAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs index 313d86ed0f7..199ac54fa95 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs @@ -34,7 +34,7 @@ public class TestAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs index 6ef1f06db8a..b7c310dd302 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs @@ -30,7 +30,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs index b401a2db5eb..6e754ebd4c7 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -24,7 +24,7 @@ public class ProxyIdFixtureAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs index 0ce67cdbbb3..c805e5b963f 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs @@ -28,7 +28,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs index 19d7b2089a7..ea0ebbe8b2c 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs @@ -25,7 +25,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs index ba684296227..2cdb49c9ece 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs @@ -35,7 +35,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs index f13b5a3ab3a..c9ccd26f591 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs @@ -22,7 +22,7 @@ public class FixtureAsync:BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs index 8249795a597..21cc5191b40 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs @@ -25,7 +25,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs index 6814a3293ad..ded31fe0896 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs @@ -24,7 +24,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs index bfa3789376f..70a4dab16bd 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs @@ -25,7 +25,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs index 35010691d2c..f7573cbe040 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs @@ -26,7 +26,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private object parentId; diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs index 3cd0c7a0763..15698f16701 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs @@ -25,7 +25,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs index b7683531478..df42844a5de 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs @@ -25,7 +25,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs index c2b34307b05..dc224aebbc6 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs @@ -20,7 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs index 805c3515fa9..e6242641bb9 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -21,7 +21,7 @@ public class AutoFlushTestFixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs index 811ee864d15..58f3f9ed70e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs @@ -35,7 +35,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index 87892eec3e0..5a61cbcf9eb 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -38,7 +38,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Async/Operations/MergeFixture.cs b/src/NHibernate.Test/Async/Operations/MergeFixture.cs index cc2b585030d..ae3f71b25e1 100644 --- a/src/NHibernate.Test/Async/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Async/Operations/MergeFixture.cs @@ -23,7 +23,7 @@ public class MergeFixtureAsync : AbstractOperationTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - !(dialect is Dialect.AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + TestDialect.SupportsEmptyInserts; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs index 74c57940fd5..c7d9f8e7f5a 100644 --- a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs @@ -38,7 +38,7 @@ protected override void Configure(Configuration configuration) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private class TestData diff --git a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs index 9580a4ba2bc..66b2d2ba36a 100644 --- a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -11,7 +11,7 @@ public class FunctionsIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly => "NHibernate.Test"; diff --git a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs index e4610e13478..1607721cc41 100644 --- a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs @@ -15,7 +15,7 @@ public class IntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly { get { return "NHibernate.Test"; } } diff --git a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs index f841745c4e2..a7b8e6c6a97 100644 --- a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -12,7 +12,7 @@ public class ProjectIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs index 83f287cdf1d..360f6d4f8fa 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -9,7 +9,7 @@ public class SimpleIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs index 81ae6811daa..be72508f85c 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -11,7 +11,7 @@ public class SubQueryIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs index 71cd73e4601..6f7e1166e4d 100644 --- a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs @@ -14,7 +14,7 @@ public abstract class AbstractCollectionEventFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs index 9f74cf0d76a..412378cc6e3 100644 --- a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs @@ -11,7 +11,7 @@ public class Fixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 6c0a1ca137c..756683dc28f 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -32,7 +32,7 @@ private static byte[] GetBytes(string str) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/FumTest.cs b/src/NHibernate.Test/Legacy/FumTest.cs index 42b1d76c157..e81954f70d2 100644 --- a/src/NHibernate.Test/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Legacy/FumTest.cs @@ -21,7 +21,7 @@ public class FumTest : TestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Legacy/MasterDetailTest.cs index 707e7a7abe5..37d14a97419 100644 --- a/src/NHibernate.Test/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Legacy/MasterDetailTest.cs @@ -21,7 +21,7 @@ public class MasterDetailTest : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Legacy/MultiTableTest.cs index 484670707d8..ddb4445a5ed 100644 --- a/src/NHibernate.Test/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Legacy/MultiTableTest.cs @@ -613,9 +613,9 @@ public void MultiTableNativeId() [Test] public void Collection() { - if (Dialect is AbstractHanaDialect) + if (!TestDialect.SupportsEmptyInserts) { - Assert.Ignore("HANA does not support inserting a row without specifying any column values"); + Assert.Ignore("Empty inserts are not supported by the current dialect."); } ISession s = OpenSession(); diff --git a/src/NHibernate.Test/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Legacy/ParentChildTest.cs index 32b1f8fbfbc..32ae9f6207b 100644 --- a/src/NHibernate.Test/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Legacy/ParentChildTest.cs @@ -15,7 +15,7 @@ public class ParentChildTest : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override IList Mappings diff --git a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs index 49dcfb71aec..e15e5d18385 100644 --- a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs @@ -28,7 +28,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index 006c019ab3d..91e6ecc0be6 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -20,7 +20,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index 5b272e8993f..13542710eed 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -20,7 +20,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index 06f122c7878..fc54fae541f 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -48,7 +48,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } } diff --git a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs index c773125fbe5..e835e85c052 100644 --- a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs @@ -16,7 +16,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs index a4919497809..7be42e20411 100644 --- a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -16,8 +16,8 @@ public class Fixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } protected override IList Mappings { diff --git a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index 99b4760bfea..664838d14a8 100644 --- a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -25,8 +25,8 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } protected override DebugSessionFactory BuildSessionFactory() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs index ef39bcd9f13..d054c19dc15 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs @@ -13,7 +13,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs index 07d158b7d75..05ea0aa769c 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs @@ -40,7 +40,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs index ebbff70013e..b9c7242ccaa 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs @@ -9,8 +9,8 @@ public class Fixture1 : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } /// /// Loads the project do not call Count on the list assigned. diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs index 3c62d33143a..3f2cec67add 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs @@ -9,8 +9,8 @@ public class Fixture2 : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values - } + return TestDialect.SupportsEmptyInserts; + } /// /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. diff --git a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs index f0aa0c614a6..2b78ee00ec6 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs @@ -16,7 +16,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs index c361bd99a16..07d082d35ba 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs @@ -9,7 +9,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private static Component GetInitializedComponent() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs index 86c5ce591ea..2f92a37f2d7 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs @@ -17,7 +17,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs index 66a833293ef..2b255447aa2 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs @@ -10,7 +10,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs index 547bb688141..9c1d86c895a 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs @@ -10,7 +10,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs index 0b8da2ceed0..2c59c099c9e 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs @@ -12,7 +12,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs index 3e1e002a14a..4f15bfff32f 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs @@ -10,7 +10,7 @@ public class Fixture : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs index 6b0544b22d8..5202eb42b4f 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs @@ -22,7 +22,7 @@ private static IEnumerable GetAndFetch(string name, ISession session) wher protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs index 342f9746e4e..a0bb48f7a92 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs @@ -20,7 +20,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs index 6fc61d19050..262f46df5b7 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -12,7 +12,7 @@ public class ProxyIdFixture : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs index 9149c9d4671..d1be2d2364d 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs @@ -17,7 +17,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs index 753723f2def..611bca6e56a 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs index 74c3a9f256c..e8bbd6fc941 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs @@ -24,7 +24,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } diff --git a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs index 25f1aa73d99..472bcf6f82b 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs @@ -11,7 +11,7 @@ public class Fixture:BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs index a7b26fdb8ed..9950a702257 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs index 7a6955d51b6..1df3b019854 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs @@ -13,7 +13,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs index 9dae5322567..7515a9114a9 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs index 47cdbed7016..be423fa4268 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private object parentId; diff --git a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs index 41be2c6d4bd..19368f62cd4 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs index d3ddd31d80c..ae19d40be4d 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs @@ -14,7 +14,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs index 9118b855e99..a9a6ae43cbe 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs @@ -9,7 +9,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs index 16067049681..6ad058d88ce 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -10,7 +10,7 @@ public class AutoFlushTestFixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs index 6fd01c465b4..ba928b17819 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs @@ -24,7 +24,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index d783445f1c8..760ff6fff1e 100644 --- a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -27,7 +27,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } [Test] diff --git a/src/NHibernate.Test/Operations/MergeFixture.cs b/src/NHibernate.Test/Operations/MergeFixture.cs index 9922883c790..3f8101980ba 100644 --- a/src/NHibernate.Test/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Operations/MergeFixture.cs @@ -11,7 +11,7 @@ public class MergeFixture : AbstractOperationTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - !(dialect is Dialect.AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + TestDialect.SupportsEmptyInserts; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs index c7026ac0744..4c7fed19153 100644 --- a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs @@ -26,7 +26,7 @@ protected override void Configure(Configuration configuration) protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // HANA does not support inserting a row without specifying any column values + return TestDialect.SupportsEmptyInserts; } private class TestData diff --git a/src/NHibernate/Dialect/AbstractHanaDialect.cs b/src/NHibernate/Dialect/AbstractHanaDialect.cs index 43c463d17c6..bdc0cdac6b9 100644 --- a/src/NHibernate/Dialect/AbstractHanaDialect.cs +++ b/src/NHibernate/Dialect/AbstractHanaDialect.cs @@ -615,14 +615,10 @@ protected virtual void RegisterHANAFunctions() #region DDL support - /// - /// Do we need to drop constraints before dropping tables in the dialect? - /// + /// public override bool DropConstraints => false; - /// - /// Do we need to qualify index names with the schema name? - /// + /// public override bool QualifyIndexName => false; public override bool SupportsCommentOn => true; @@ -637,12 +633,10 @@ public override string GetColumnComment(string comment) return "comment '" + comment + "'"; } - /// Does this dialect support column-level check constraints? - /// True if column-level CHECK constraints are supported; false otherwise. + /// public override bool SupportsColumnCheck => false; - /// Does this dialect support table-level check constraints? - /// True if table-level CHECK constraints are supported; false otherwise. + /// public override bool SupportsTableCheck => true; public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) @@ -654,39 +648,23 @@ public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) #region Lock acquisition support - /// Is FOR UPDATE OF syntax expecting columns? - /// if the database expects a column list with FOR UPDATE OF syntax, - /// if it expects table alias instead or do not support FOR UPDATE OF syntax. - // Since v5.1 + /// [Obsolete("Use UsesColumnsWithForUpdateOf instead")] public override bool ForUpdateOfColumns => true; - /// - /// Get the FOR UPDATE OF column_list fragment appropriate for this - /// dialect given the aliases of the columns to be write locked. - /// - /// The columns to be write locked. - /// The appropriate FOR UPDATE OF column_list clause string. + /// public override string GetForUpdateString(string aliases) { return ForUpdateString + " of " + aliases; } - /// - /// Retrieves the FOR UPDATE NOWAIT syntax specific to this dialect - /// - /// The appropriate FOR UPDATE NOWAIT clause string. + /// public override string ForUpdateNowaitString { get { return ForUpdateString + " nowait"; } } - /// - /// Get the FOR UPDATE OF column_list NOWAIT fragment appropriate - /// for this dialect given the aliases of the columns or tables to be write locked. - /// - /// The columns or tables to be write locked. - /// The appropriate FOR UPDATE colunm_or_table_list NOWAIT clause string. + /// public override string GetForUpdateNowaitString(string aliases) { return GetForUpdateString(aliases) + " nowait"; @@ -698,43 +676,22 @@ public override string GetForUpdateNowaitString(string aliases) #region Temporary table support - /// Does this dialect support temporary tables? + /// public override bool SupportsTemporaryTables => true; - /// Generate a temporary table name given the bas table. - /// The table name from which to base the temp table name. - /// The generated temp table name. + /// public override string GenerateTemporaryTableName(string baseTableName) { return "#HT_" + baseTableName; } - /// - /// Does the dialect require that temporary table DDL statements occur in - /// isolation from other statements? This would be the case if the creation - /// would cause any current transaction to get committed implicitly. - /// - /// see the result matrix above. - /// - /// JDBC defines a standard way to query for this information via the - /// {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()} - /// method. However, that does not distinguish between temporary table - /// DDL and other forms of DDL; MySQL, for example, reports DDL causing a - /// transaction commit via its driver, even though that is not the case for - /// temporary table DDL. - ///

- /// Possible return values and their meanings:

    - ///
  • {@link Boolean#TRUE} - Unequivocally, perform the temporary table DDL in isolation.
  • - ///
  • {@link Boolean#FALSE} - Unequivocally, do not perform the temporary table DDL in isolation.
  • - ///
  • null - defer to the JDBC driver response in regards to {@link java.sql.DatabaseMetaData#dataDefinitionCausesTransactionCommit()}
  • - ///
- ///
+ /// public override bool? PerformTemporaryTableDDLInIsolation() { return false; } - /// Do we need to drop the temporary table after use? + /// public override bool DropTemporaryTableAfterUse() { return true; @@ -746,14 +703,7 @@ public override bool DropTemporaryTableAfterUse() #region Callable statement support - /// - /// Registers an OUT parameter which will be returning a - /// . How this is accomplished varies greatly - /// from DB to DB, hence its inclusion (along with {@link #getResultSet}) here. - /// - /// The callable statement. - /// The bind position at which to register the OUT param. - /// The number of (contiguous) bind positions used. + /// public override int RegisterResultSetOutParameter(DbCommand statement, int position) { // Result set (TABLE) OUT parameters don't need to be registered @@ -764,24 +714,10 @@ public override int RegisterResultSetOutParameter(DbCommand statement, int posit #region Current timestamp support - /// Does this dialect support a way to retrieve the database's current timestamp value? + /// public override bool SupportsCurrentTimestampSelection => true; - /// - /// Gives the best resolution that the database can use for storing - /// date/time values, in ticks. - /// - /// - /// - /// For example, if the database can store values with 100-nanosecond - /// precision, this property is equal to 1L. If the database can only - /// store values with 1-millisecond precision, this property is equal - /// to 10000L (number of ticks in a millisecond). - /// - /// - /// Used in TimestampType. - /// - /// + /// public override long TimestampResolutionInTicks { get { return 10L; } // Maximum precision (one tick) @@ -792,9 +728,7 @@ public override long TimestampResolutionInTicks #region Constraint support - /// - /// Completely optional cascading drop clause - /// + /// public override string CascadeConstraintsString { get { return " cascade"; } @@ -806,36 +740,22 @@ public override string CascadeConstraintsString #region IDENTITY support - /// - /// Does this dialect support identity column key generation? - /// + /// public override bool SupportsIdentityColumns => true; - /// - /// Get the select command to use to retrieve the last generated IDENTITY - /// value for a particular table - /// - /// The table into which the insert was done - /// The PK column. - /// The type code. - /// The appropriate select command + /// public override string GetIdentitySelectString(string identityColumn, string tableName, DbType type) { return IdentitySelectString + tableName; } - /// - /// Get the select command to use to retrieve the last generated IDENTITY value. - /// - /// The appropriate select command + /// public override string IdentitySelectString { get { return "select current_identity_value() from "; } } - /// - /// The keyword used to specify an identity column, if native key generation is supported - /// + /// public override string IdentityColumnString { get { return "generated by default as identity"; } @@ -845,106 +765,37 @@ public override string IdentityColumnString #region SEQUENCE support - /// - /// Does this dialect support sequences? - /// + /// public override bool SupportsSequences => true; - /// - /// Does this dialect support "pooled" sequences? - /// - /// True if such "pooled" sequences are supported; false otherwise. - /// - /// A pooled sequence is one that has a configurable initial size and increment - /// size. It enables NHibernate to be allocated a pool/block/range of IDs, - /// which can reduce the frequency of round trips to the database during ID - /// generation. - /// - /// - /// + /// public override bool SupportsPooledSequences => true; - /// - /// Generate the appropriate select statement to to retreive the next value - /// of a sequence. - /// - /// the name of the sequence - /// String The "nextval" select string. - /// This should be a "stand alone" select statement. + /// public override string GetSequenceNextValString(string sequenceName) { return "select " + GetSelectSequenceNextValString(sequenceName) + " from dummy"; } - /// - /// Typically dialects which support sequences can drop a sequence - /// with a single command. - /// - /// The name of the sequence - /// The sequence drop commands - /// - /// This is convenience form of - /// to help facilitate that. - /// - /// Dialects which support sequences and can drop a sequence in a - /// single command need *only* override this method. Dialects - /// which support sequences but require multiple commands to drop - /// a sequence should instead override . - /// + /// public override string GetDropSequenceString(string sequenceName) { return "drop sequence " + sequenceName; } - /// - /// Generate the select expression fragment that will retrieve the next - /// value of a sequence as part of another (typically DML) statement. - /// - /// the name of the sequence - /// The "nextval" fragment. - /// - /// This differs from in that this - /// should return an expression usable within another statement. - /// + /// public override string GetSelectSequenceNextValString(string sequenceName) { return sequenceName + ".nextval"; } - /// - /// Typically dialects which support sequences can create a sequence - /// with a single command. - /// - /// The name of the sequence - /// The sequence creation command - /// - /// This is convenience form of to help facilitate that. - /// Dialects which support sequences and can create a sequence in a - /// single command need *only* override this method. Dialects - /// which support sequences but require multiple commands to create - /// a sequence should instead override . - /// + /// public override string GetCreateSequenceString(string sequenceName) { return "create sequence " + sequenceName; } - /// - /// Overloaded form of , additionally - /// taking the initial value and increment size to be applied to the sequence - /// definition. - /// - /// The name of the sequence - /// The initial value to apply to 'create sequence' statement - /// The increment value to apply to 'create sequence' statement - /// The sequence creation command - /// - /// The default definition is to suffix - /// with the string: " start with {initialValue} increment by {incrementSize}" where - /// {initialValue} and {incrementSize} are replacement placeholders. Generally - /// dialects should only need to override this method if different key phrases - /// are used to apply the allocation information. - /// + /// protected override string GetCreateSequenceString(string sequenceName, int initialValue, int incrementSize) { if (incrementSize == 0) @@ -972,8 +823,7 @@ protected override string GetCreateSequenceString(string sequenceName, int initi return createSequenceString; } - /// Get the select command used retrieve the names of all sequences. - /// The select command; or null if sequences are not supported. + /// public override string QuerySequencesString { get { return "select sequence_name from sys.sequences"; } @@ -985,39 +835,23 @@ public override string QuerySequencesString #region Miscellaneous support - /// The SQL literal value to which this database maps boolean values. - /// The boolean value - /// The appropriate SQL literal. + /// public override string ToBooleanValueString(bool value) { return value ? "true" : "false"; } - /// - /// Does this dialect support concurrent writing connections in the same transaction? - /// + /// public override bool SupportsConcurrentWritingConnectionsInSameTransaction => false; #endregion #region Limit/offset support - /// - /// Does this Dialect have some kind of LIMIT syntax? - /// - /// False, unless overridden. + /// public override bool SupportsLimit => true; - /// - /// Attempts to add a LIMIT clause to the given SQL SELECT. - /// Expects any database-specific offset and limit adjustments to have already been performed (ex. UseMaxForLimit, OffsetStartsAtOne). - /// - /// The to base the limit query off. - /// Offset of the first row to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no limit is requested. This should have already been adjusted to account for OffsetStartsAtOne. - /// Maximum number of rows to be returned by the query. This may be represented as a parameter, a string literal, or a null value if no offset is requested. This should have already been adjusted to account for UseMaxForLimit. - /// A new that contains the LIMIT clause. Returns null - /// if represents a SQL statement to which a limit clause cannot be added, - /// for example when the query string is custom SQL invoking a stored procedure. + /// public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit) { if (offset == null && limit == null) @@ -1054,17 +888,7 @@ public override SqlString GetLimitString(SqlString queryString, SqlString offset #region Union subclass support - /// - /// Given a type code, determine an appropriate - /// null value to use in a select clause. - /// - /// The type code. - /// The appropriate select clause value fragment. - /// - /// One thing to consider here is that certain databases might - /// require proper casting for the nulls here since the select here - /// will be part of a UNION/UNION ALL. - /// + /// public override string GetSelectClauseNullString(SqlType sqlType) { switch (sqlType.DbType) @@ -1106,149 +930,71 @@ public override string GetSelectClauseNullString(SqlType sqlType) return "null"; } - /// - /// Does this dialect support UNION ALL, which is generally a faster variant of UNION? - /// True if UNION ALL is supported; false otherwise. - /// + /// public override bool SupportsUnionAll => true; #endregion #region Informational metadata - /// - /// Does this dialect support empty IN lists? - /// For example, is [where XYZ in ()] a supported construct? - /// - /// True if empty in lists are supported; false otherwise. + /// public override bool SupportsEmptyInList => false; - /// - /// Is this dialect known to support what ANSI-SQL terms "row value - /// constructor" syntax; sometimes called tuple syntax. - ///

- /// Basically, does it support syntax like - /// "... where (FIRST_NAME, LAST_NAME) = ('Steve', 'Ebersole') ...". - ///

- /// - /// True if this SQL dialect is known to support "row value - /// constructor" syntax; false otherwise. - /// + /// public override bool SupportsRowValueConstructorSyntax => true; - /// - /// If the dialect supports {@link #supportsRowValueConstructorSyntax() row values}, - /// does it offer such support in IN lists as well? - ///

- /// For example, "... where (FIRST_NAME, LAST_NAME) IN ( (?, ?), (?, ?) ) ..." - ///

- /// - /// True if this SQL dialect is known to support "row value - /// constructor" syntax in the IN list; false otherwise. - /// + /// public override bool SupportsRowValueConstructorSyntaxInInList => true; - /// - /// Does this dialect support definition of cascade delete constraints - /// which can cause circular chains? - /// - /// True if circular cascade delete constraints are supported; false otherwise. + /// public override bool SupportsCircularCascadeDeleteConstraints => false; - /// - /// Expected LOB usage pattern is such that I can perform an insert - /// via prepared statement with a parameter binding for a LOB value - /// without crazy casting to JDBC driver implementation-specific classes... - ///

- /// Part of the trickiness here is the fact that this is largely - /// driver dependent. For example, Oracle (which is notoriously bad with - /// LOB support in their drivers historically) actually does a pretty good - /// job with LOB support as of the 10.2.x versions of their drivers... - ///

- /// - /// True if normal LOB usage patterns can be used with this driver; - /// false if driver-specific hookiness needs to be applied. - /// + /// public override bool SupportsExpectedLobUsagePattern => false; - /// - /// Is it supported to materialize a LOB locator outside the transaction in - /// which it was created? - ///

- /// Again, part of the trickiness here is the fact that this is largely - /// driver dependent. - ///

- /// NOTE: all database I have tested which {@link #supportsExpectedLobUsagePattern()} - /// also support the ability to materialize a LOB outside the owning transaction... - ///

- /// True if unbounded materialization is supported; false otherwise. + /// public override bool SupportsUnboundedLobLocatorMaterialization => false; - /// Does the dialect support an exists statement in the select clause? - /// True if exists checks are allowed in the select clause; false otherwise. + /// public override bool SupportsExistsInSelect => false; - /// - /// Does this dialect support scalar sub-selects? - /// - /// - /// Scalar sub-selects are sub-queries returning a scalar value, not a set. See https://stackoverflow.com/a/648049/1178314 - /// + /// public override bool SupportsScalarSubSelects => false; #endregion - /// - /// Get the command used to select a GUID from the underlying database. - /// (Optional operation.) - /// - /// The appropriate command. + /// public override string SelectGUIDString { get { return "select sysuuid from dummy"; } } - /// - /// Should the value returned by - /// be treated as callable. Typically this indicates that JDBC escape - /// syntax is being used... - /// + /// public override bool IsCurrentTimestampSelectStringCallable => false; - /// - /// Retrieve the command used to retrieve the current timestammp from the database. - /// + /// public override string CurrentTimestampSelectString { get { return "select current_timestamp from dummy"; } } - /// - /// The keyword used to insert a row without specifying any column values - /// + /// public override string NoColumnsInsertString { get { throw new MappingException("HANA does not support inserting a row without specifying any column values"); } } - // 18 is the smallest of all dialects we handle. - /// - /// The maximum length a SQL alias can have. - /// + /// public override int MaxAliasLength => 128; - /// - /// The syntax used to add a column to a table. Note this is deprecated - /// + /// public override string AddColumnString { get { return "add ("; } } - /// - /// The syntax for the suffix used to add a column to a table. Note this is deprecated - /// + /// public override string AddColumnSuffixString { get { return ")"; } diff --git a/src/NHibernate/Dialect/Dialect.cs b/src/NHibernate/Dialect/Dialect.cs index ce895098065..26abe6bc081 100644 --- a/src/NHibernate/Dialect/Dialect.cs +++ b/src/NHibernate/Dialect/Dialect.cs @@ -2473,7 +2473,7 @@ public virtual string LowercaseFunction public virtual char StatementTerminator => ';'; /// - /// The syntax used to add a column to a table. Note this is deprecated + /// The syntax used to add a column to a table. /// public virtual string AddColumnString { @@ -2481,7 +2481,7 @@ public virtual string AddColumnString } /// - /// The syntax for the suffix used to add a column to a table. Note this is deprecated + /// The syntax for the suffix used to add a column to a table. /// public virtual string AddColumnSuffixString { diff --git a/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs b/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs index 544eb51fd8c..ab722134e65 100644 --- a/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs +++ b/src/NHibernate/Dialect/Function/SQLFunctionTemplateWithRequiredParameters.cs @@ -11,12 +11,7 @@ namespace NHibernate.Dialect.Function { /// - /// Represents HQL functions that can have different representations in different SQL dialects. - /// E.g. in HQL we can define function concat(?1, ?2) to concatenate two strings - /// p1 and p2. Target SQL function will be dialect-specific, e.g. (?1 || ?2) for - /// Oracle, concat(?1, ?2) for MySql, (?1 + ?2) for MS SQL. - /// Each dialect will define a template as a string (exactly like above) marking function - /// parameters with '?' followed by parameter's index (first index is 1). + /// A template-based SQL function which substitutes required missing parameters with defaults. /// [Serializable] public class SQLFunctionTemplateWithRequiredParameters : SQLFunctionTemplate @@ -28,6 +23,11 @@ public SQLFunctionTemplateWithRequiredParameters(IType type, string template, ob _requiredArgs = requiredArgs; } + public SQLFunctionTemplateWithRequiredParameters(IType type, string template, object[] requiredArgs, bool hasParenthesesIfNoArgs) : base(type, template, hasParenthesesIfNoArgs) + { + _requiredArgs = requiredArgs; + } + public override SqlString Render(IList args, ISessionFactoryImplementor factory) { var combinedArgs = diff --git a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs index a9d980ae548..f77b850e62c 100644 --- a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs @@ -33,13 +33,13 @@ public HanaColumnStoreDialect() { } - /// Command used to create a table. + /// public override string CreateTableString { get { return "create column table"; } } - /// Command used to create a temporary table. + /// public override string CreateTemporaryTableString { get { return "create local temporary column table"; } diff --git a/src/NHibernate/Dialect/HanaRowStoreDialect.cs b/src/NHibernate/Dialect/HanaRowStoreDialect.cs index c9319c394c7..af620c028fb 100644 --- a/src/NHibernate/Dialect/HanaRowStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaRowStoreDialect.cs @@ -33,13 +33,13 @@ public HanaRowStoreDialect() { } - /// Command used to create a table. + /// public override string CreateTableString { get { return "create row table"; } } - /// Command used to create a temporary table. + /// public override string CreateTemporaryTableString { get { return "create local temporary row table"; } diff --git a/src/NHibernate/Driver/HanaDriver.cs b/src/NHibernate/Driver/HanaDriver.cs index 9e0a82db64e..de7e2af9c10 100644 --- a/src/NHibernate/Driver/HanaDriver.cs +++ b/src/NHibernate/Driver/HanaDriver.cs @@ -8,9 +8,9 @@ namespace NHibernate.Driver ///
/// /// - /// In order to use this driver you must have the assembly Sap.Data.Hana.dll available for + /// In order to use this driver you must have the assembly Sap.Data.Hana.v4.5.dll available for /// NHibernate to load, including its dependencies (libadonetHDB.dll and libSQLDBCHDB.dll - /// are required by the assembly Sap.Data.Hana.dll as of the time of this writing). + /// are required by the assembly Sap.Data.Hana.v4.5.dll as of the time of this writing). /// /// /// Please check the product's website @@ -23,7 +23,7 @@ public class HanaDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider /// Initializes a new instance of the class. ///
/// - /// Thrown when the Sap.Data.Hana assembly can not be loaded. + /// Thrown when the Sap.Data.Hana.v4.5 assembly can not be loaded. /// public HanaDriver() : base( "Sap.Data.Hana", @@ -33,35 +33,13 @@ public HanaDriver() : base( { } - /// - /// Does this Driver require the use of a Named Prefix in the SQL statement. - /// - /// - /// For example, SqlClient requires select * from simple where simple_id = @simple_id - /// If this is false, like with the OleDb provider, then it is assumed that - /// the ? can be a placeholder for the parameter in the SQL statement. - /// + /// public override bool UseNamedPrefixInSql => false; - /// - /// Does this Driver require the use of the Named Prefix when trying - /// to reference the Parameter in the Command's Parameter collection. - /// - /// - /// This is really only useful when the UseNamedPrefixInSql == true. When this is true the - /// code will look like: - /// DbParameter param = cmd.Parameters["@paramName"] - /// if this is false the code will be - /// DbParameter param = cmd.Parameters["paramName"]. - /// + /// public override bool UseNamedPrefixInParameter => false; - /// - /// The Named Prefix for parameters. - /// - /// - /// Sql Server uses "@" and Oracle uses ":". - /// + /// public override string NamedPrefix => String.Empty; public override bool SupportsMultipleOpenReaders => false; @@ -79,6 +57,7 @@ public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplement public override bool HasDelayedDistributedTransactionCompletion => false; + /// public override bool SupportsEnlistmentWhenAutoEnlistmentIsDisabled => false; System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(HanaBatchingBatcherFactory); From 212d10993eea6e44d9c29c30f25422884d319002 Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Mon, 16 Apr 2018 16:36:36 +0200 Subject: [PATCH 04/12] Add TestDialect#SupportsEmptyInsertsOrHasNonIdentityNativeGenerator This new property can be used to exclude tests where empty inserts happen only when the entities generator is native while the dialect uses identity for this generator and empty inserts aren't supported by the database. --- .../Criteria/Lambda/FunctionsIntegrationFixture.cs | 3 +-- .../Async/Criteria/Lambda/IntegrationFixture.cs | 3 +-- .../Criteria/Lambda/ProjectIntegrationFixture.cs | 3 +-- .../Async/Criteria/Lambda/SimpleIntegrationFixture.cs | 3 +-- .../Criteria/Lambda/SubQueryIntegrationFixture.cs | 3 +-- .../Collections/AbstractCollectionEventFixture.cs | 4 +--- .../Async/GenericTest/Overall/Fixture.cs | 3 +-- src/NHibernate.Test/Async/Legacy/FooBarTest.cs | 3 ++- src/NHibernate.Test/Async/Legacy/FumTest.cs | 3 +-- src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs | 2 +- src/NHibernate.Test/Async/Legacy/MultiTableTest.cs | 3 ++- src/NHibernate.Test/Async/Legacy/ParentChildTest.cs | 2 +- .../Async/NHSpecificTest/CollectionFixture.cs | 4 +--- .../NHSpecificTest/Docs/Associations/BiM21/Fixture.cs | 4 +--- .../Docs/ExampleParentChild/UpdateFixture.cs | 4 +--- .../GH1565/LockEntityWithOuterJoinTest.cs | 3 +-- .../Async/NHSpecificTest/LazyLoadBugTest.cs | 4 +--- .../Async/NHSpecificTest/ListsWithHoles/Fixture.cs | 9 +-------- .../NHSpecificTest/LoadingNullEntityInSet/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH1301/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH1388/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH1601/Fixture1.cs | 4 +--- .../Async/NHSpecificTest/NH1601/Fixture2.cs | 4 +--- .../Async/NHSpecificTest/NH1609/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH1691/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH1869/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH1914/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH2328/Fixture.cs | 5 ++--- .../Async/NHSpecificTest/NH2409/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH2703/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH2705/Test.cs | 3 +-- .../Async/NHSpecificTest/NH3050/Fixture.cs | 5 ++--- .../Async/NHSpecificTest/NH3141/ProxyIdFixture.cs | 3 +-- .../Async/NHSpecificTest/NH315/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH386/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH440/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH473/Fixture.cs | 6 +----- .../Async/NHSpecificTest/NH479/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH521/Fixture.cs | 3 +-- .../Async/NHSpecificTest/NH607/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH643/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH687/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH704/Fixture.cs | 4 +--- .../Async/NHSpecificTest/NH826/Fixture.cs | 3 +-- .../NHSpecificTest/NH830/AutoFlushTestFixture.cs | 3 +-- .../Async/NHSpecificTest/NH898/NH898Fixture.cs | 3 +-- .../SqlConverterAndMultiQuery/Fixture.cs | 3 +-- src/NHibernate.Test/Async/Operations/MergeFixture.cs | 2 +- .../Async/Stateless/StatelessSessionQueryFixture.cs | 3 +-- .../Criteria/Lambda/FunctionsIntegrationFixture.cs | 3 +-- .../Criteria/Lambda/IntegrationFixture.cs | 3 +-- .../Criteria/Lambda/ProjectIntegrationFixture.cs | 3 +-- .../Criteria/Lambda/SimpleIntegrationFixture.cs | 3 +-- .../Criteria/Lambda/SubQueryIntegrationFixture.cs | 3 +-- .../Collections/AbstractCollectionEventFixture.cs | 4 +--- src/NHibernate.Test/GenericTest/Overall/Fixture.cs | 3 +-- src/NHibernate.Test/Legacy/FooBarTest.cs | 3 ++- src/NHibernate.Test/Legacy/FumTest.cs | 3 +-- src/NHibernate.Test/Legacy/MasterDetailTest.cs | 2 +- src/NHibernate.Test/Legacy/MultiTableTest.cs | 3 ++- src/NHibernate.Test/Legacy/ParentChildTest.cs | 2 +- .../NHSpecificTest/CollectionFixture.cs | 4 +--- .../NHSpecificTest/Docs/Associations/BiM21/Fixture.cs | 4 +--- .../Docs/ExampleParentChild/UpdateFixture.cs | 4 +--- .../GH1565/LockEntityWithOuterJoinTest.cs | 5 ++--- src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs | 4 +--- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 9 +-------- .../NHSpecificTest/LoadingNullEntityInSet/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs | 4 +--- .../NHSpecificTest/NH3141/ProxyIdFixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs | 8 ++------ src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs | 3 +-- src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs | 4 +--- src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs | 3 +-- .../NHSpecificTest/NH830/AutoFlushTestFixture.cs | 3 +-- .../NHSpecificTest/NH898/NH898Fixture.cs | 3 +-- .../SqlConverterAndMultiQuery/Fixture.cs | 3 +-- src/NHibernate.Test/Operations/MergeFixture.cs | 2 +- .../Stateless/StatelessSessionQueryFixture.cs | 3 +-- src/NHibernate.Test/TestDialect.cs | 11 +++++++++++ 99 files changed, 117 insertions(+), 246 deletions(-) diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs index aa90ddf80f3..6171cad68be 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -11,7 +11,6 @@ using System; using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -22,7 +21,7 @@ public class FunctionsIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly => "NHibernate.Test"; diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs index 7654e7ee846..443a327f0fa 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs @@ -16,7 +16,6 @@ using NUnit.Framework; using NHibernate.Criterion; -using NHibernate.Dialect; namespace NHibernate.Test.Criteria.Lambda { @@ -27,7 +26,7 @@ public class IntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly { get { return "NHibernate.Test"; } } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs index bfdcfb7a6d4..26b19b1432b 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -11,7 +11,6 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.Transform; using NUnit.Framework; @@ -23,7 +22,7 @@ public class ProjectIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs index 9ed1bbed62d..0c49f9c1c1c 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -9,7 +9,6 @@ using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -20,7 +19,7 @@ public class SimpleIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs index 06389178ddb..3e36927db22 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -11,7 +11,6 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -22,7 +21,7 @@ public class SubQueryIntegrationFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs index 34b9d794a1a..9f6e691d52c 100644 --- a/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Async/Events/Collections/AbstractCollectionEventFixture.cs @@ -12,8 +12,6 @@ using System.Collections.Generic; using NHibernate.Collection; using NHibernate.Collection.Generic; -using NHibernate.Event; -using NHibernate.Dialect; using NHibernate.Test.Events.Collections.Association.Bidirectional.ManyToMany; using NUnit.Framework; @@ -26,7 +24,7 @@ public abstract class AbstractCollectionEventFixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs index 1c99da13610..13d187fa3c1 100644 --- a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs @@ -11,7 +11,6 @@ using System; using System.Collections; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -22,7 +21,7 @@ public class FixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index 75728192992..18f6546237b 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -24,6 +24,7 @@ using NHibernate.Dialect; using NHibernate.DomainModel; using NHibernate.Criterion; +using NHibernate.Id; using NHibernate.Proxy; using NHibernate.Type; using NHibernate.Util; @@ -44,7 +45,7 @@ private static byte[] GetBytes(string str) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/FumTest.cs b/src/NHibernate.Test/Async/Legacy/FumTest.cs index 642d243eda0..faad72c71ee 100644 --- a/src/NHibernate.Test/Async/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FumTest.cs @@ -15,7 +15,6 @@ using System.Runtime.Serialization.Formatters.Binary; using NHibernate.DomainModel; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.Type; using NUnit.Framework; @@ -32,7 +31,7 @@ public class FumTestAsync : TestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs index 132f86b0040..2167e46746b 100644 --- a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs @@ -32,7 +32,7 @@ public class MasterDetailTestAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs index d54b495f380..a8fb29df901 100644 --- a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using NHibernate.Dialect; using NHibernate.DomainModel; +using NHibernate.Id; using NUnit.Framework; namespace NHibernate.Test.Legacy @@ -612,7 +613,7 @@ public async Task MultiTableNativeIdAsync() [Test] public async Task CollectionAsync() { - if (!TestDialect.SupportsEmptyInserts) + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) { Assert.Ignore("Empty inserts are not supported by the current dialect."); } diff --git a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs index 59ecb8464ce..4d6fb4c0ad6 100644 --- a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs @@ -26,7 +26,7 @@ public class ParentChildTestAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs index 87c586e83a1..6f03d76326d 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/CollectionFixture.cs @@ -8,9 +8,7 @@ //------------------------------------------------------------------------------ -using System; using System.Collections; -using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -39,7 +37,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index f2976a538a1..5da8738d3f0 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -8,9 +8,7 @@ //------------------------------------------------------------------------------ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.Associations.BiM21 @@ -31,7 +29,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index 7c108940033..a08fa8b4b13 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -8,9 +8,7 @@ //------------------------------------------------------------------------------ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.ExampleParentChild @@ -31,7 +29,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index 232dfd5c609..48d02c3df07 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -8,7 +8,6 @@ //------------------------------------------------------------------------------ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.GH1565 @@ -59,7 +58,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } } } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs index 093497e70b3..4c1540df513 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LazyLoadBugTest.cs @@ -8,9 +8,7 @@ //------------------------------------------------------------------------------ -using System; using System.Collections; -using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -27,7 +25,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs index 746aa0fcbf8..ac92e45e482 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -8,13 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using System.Text; -using log4net.Appender; -using log4net.Core; -using log4net.Repository.Hierarchy; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.ListsWithHoles @@ -27,7 +20,7 @@ public class FixtureAsync : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index aa0d44cba9e..1c93aebbe0e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using NHibernate.Dialect; - namespace NHibernate.Test.NHSpecificTest.LoadingNullEntityInSet { using System.Collections; @@ -36,7 +34,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override DebugSessionFactory BuildSessionFactory() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs index 8e141323d6e..273ca58ad53 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1301/Fixture.cs @@ -8,7 +8,6 @@ //------------------------------------------------------------------------------ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1301 @@ -24,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs index 13c01a49975..fe29f63e407 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1388/Fixture.cs @@ -9,7 +9,6 @@ using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1388 @@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs index 066cfc2e94f..e2c5e78bd47 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -21,7 +19,7 @@ public class Fixture1Async : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } /// diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs index 79d7934eb0f..7137148460b 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -21,7 +19,7 @@ public class Fixture2Async : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } /// diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs index 8fe5277d66e..6975d2d08eb 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs @@ -10,8 +10,6 @@ using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; -using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1609 @@ -28,7 +26,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs index 0070be19a8b..cdc7387a376 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1691/Fixture.cs @@ -9,7 +9,6 @@ using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1691 @@ -20,7 +19,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private static Component GetInitializedComponent() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs index 8d18cc1dba1..65a85dd5188 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs @@ -9,8 +9,6 @@ using System.Collections; -using NHibernate.Dialect; -using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1869 @@ -29,7 +27,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs index 9d93c5e3b34..d6fcf07b29a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1914/Fixture.cs @@ -10,7 +10,6 @@ using System; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1914 @@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs index 9c02f320451..ecc820d6547 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2328/Fixture.cs @@ -9,9 +9,8 @@ using System.Linq; -using NHibernate.Dialect; -using NHibernate.Linq; using NUnit.Framework; +using NHibernate.Linq; namespace NHibernate.Test.NHSpecificTest.NH2328 { @@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs index 064c36d9900..4318e325157 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2409/Fixture.cs @@ -8,10 +8,8 @@ //------------------------------------------------------------------------------ -using System; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.SqlCommand; using NUnit.Framework; @@ -23,7 +21,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs index 1e758a4754c..43e122587e8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2703/Fixture.cs @@ -8,7 +8,6 @@ //------------------------------------------------------------------------------ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2703 @@ -21,7 +20,7 @@ public class FixtureAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs index 199ac54fa95..6ec92361ac0 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Linq; -using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -34,7 +33,7 @@ public class TestAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs index b7c310dd302..2bcaaeee0e9 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs @@ -16,12 +16,11 @@ using System.Threading.Tasks; using NHibernate.Engine.Query; -using NHibernate.Linq; using NHibernate.Util; using NUnit.Framework; using System.Linq; -using NHibernate.Dialect; +using NHibernate.Linq; namespace NHibernate.Test.NHSpecificTest.NH3050 { @@ -30,7 +29,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs index 6e754ebd4c7..933db3dc476 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -10,7 +10,6 @@ using System; using System.Diagnostics; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3141 @@ -24,7 +23,7 @@ public class ProxyIdFixtureAsync : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs index c805e5b963f..67d731e834d 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH315/Fixture.cs @@ -9,7 +9,6 @@ using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH315 @@ -28,7 +27,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs index ea0ebbe8b2c..5ac63fcbe84 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -25,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs index 2cdb49c9ece..3bec8c77eec 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH440/Fixture.cs @@ -8,9 +8,7 @@ //------------------------------------------------------------------------------ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH440 @@ -35,7 +33,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs index c9ccd26f591..cb8c96d7c6e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH473/Fixture.cs @@ -8,10 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using System.Collections.Generic; -using System.Text; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH473 @@ -22,7 +18,7 @@ public class FixtureAsync:BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs index 21cc5191b40..4888f4a7c7a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH479/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH479 @@ -25,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs index ded31fe0896..0c2e46b13d1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH521/Fixture.cs @@ -8,7 +8,6 @@ //------------------------------------------------------------------------------ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH521 @@ -24,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs index 70a4dab16bd..553ba575773 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH607/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH607 @@ -25,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs index f7573cbe040..9edf70f29c1 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH643/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH643 @@ -26,7 +24,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private object parentId; diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs index 15698f16701..413e8b3759a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH687/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH687 @@ -25,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs index df42844a5de..a29d68852c0 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH704/Fixture.cs @@ -8,8 +8,6 @@ //------------------------------------------------------------------------------ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH704 @@ -25,7 +23,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs index dc224aebbc6..9acffe78e89 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH826/Fixture.cs @@ -9,7 +9,6 @@ using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH826 @@ -20,7 +19,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs index e6242641bb9..f0d9984e77c 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -10,7 +10,6 @@ using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH830 @@ -21,7 +20,7 @@ public class AutoFlushTestFixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs index 58f3f9ed70e..e30e7c6bb37 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH898/NH898Fixture.cs @@ -10,7 +10,6 @@ using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH898 @@ -35,7 +34,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index 5a61cbcf9eb..a01b630215d 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -9,7 +9,6 @@ using NHibernate.Cfg; -using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; using NUnit.Framework; @@ -38,7 +37,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Async/Operations/MergeFixture.cs b/src/NHibernate.Test/Async/Operations/MergeFixture.cs index ae3f71b25e1..493041c82a0 100644 --- a/src/NHibernate.Test/Async/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Async/Operations/MergeFixture.cs @@ -23,7 +23,7 @@ public class MergeFixtureAsync : AbstractOperationTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - TestDialect.SupportsEmptyInserts; + (TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator); } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs index c7d9f8e7f5a..8a25d5c7ef4 100644 --- a/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Async/Stateless/StatelessSessionQueryFixture.cs @@ -10,7 +10,6 @@ using System.Collections; using NHibernate.Cfg; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Stateless @@ -38,7 +37,7 @@ protected override void Configure(Configuration configuration) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private class TestData diff --git a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs index 66b2d2ba36a..6834278c7d9 100644 --- a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -1,7 +1,6 @@ using System; using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -11,7 +10,7 @@ public class FunctionsIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly => "NHibernate.Test"; diff --git a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs index 1607721cc41..e42198acbb0 100644 --- a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs @@ -6,7 +6,6 @@ using NUnit.Framework; using NHibernate.Criterion; -using NHibernate.Dialect; namespace NHibernate.Test.Criteria.Lambda { @@ -15,7 +14,7 @@ public class IntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly { get { return "NHibernate.Test"; } } diff --git a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs index a7b8e6c6a97..ce7ffd9048e 100644 --- a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -1,7 +1,6 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.Transform; using NUnit.Framework; @@ -12,7 +11,7 @@ public class ProjectIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs index 360f6d4f8fa..a7d39714b0c 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -1,5 +1,4 @@ using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -9,7 +8,7 @@ public class SimpleIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs index be72508f85c..e8e1beb9243 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -1,7 +1,6 @@ using System.Collections; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Criteria.Lambda @@ -11,7 +10,7 @@ public class SubQueryIntegrationFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs index 6f7e1166e4d..3c6549f4c83 100644 --- a/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs +++ b/src/NHibernate.Test/Events/Collections/AbstractCollectionEventFixture.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using NHibernate.Collection; using NHibernate.Collection.Generic; -using NHibernate.Event; -using NHibernate.Dialect; using NHibernate.Test.Events.Collections.Association.Bidirectional.ManyToMany; using NUnit.Framework; @@ -14,7 +12,7 @@ public abstract class AbstractCollectionEventFixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override string MappingsAssembly diff --git a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs index 412378cc6e3..9b804951520 100644 --- a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -11,7 +10,7 @@ public class Fixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 756683dc28f..80e319046ca 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -14,6 +14,7 @@ using NHibernate.Dialect; using NHibernate.DomainModel; using NHibernate.Criterion; +using NHibernate.Id; using NHibernate.Proxy; using NHibernate.Type; using NHibernate.Util; @@ -32,7 +33,7 @@ private static byte[] GetBytes(string str) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/FumTest.cs b/src/NHibernate.Test/Legacy/FumTest.cs index e81954f70d2..c25d00fd12c 100644 --- a/src/NHibernate.Test/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Legacy/FumTest.cs @@ -5,7 +5,6 @@ using System.Runtime.Serialization.Formatters.Binary; using NHibernate.DomainModel; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.Type; using NUnit.Framework; @@ -21,7 +20,7 @@ public class FumTest : TestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Legacy/MasterDetailTest.cs index 37d14a97419..fde99165dcb 100644 --- a/src/NHibernate.Test/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Legacy/MasterDetailTest.cs @@ -21,7 +21,7 @@ public class MasterDetailTest : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Legacy/MultiTableTest.cs index ddb4445a5ed..8c740cb7cce 100644 --- a/src/NHibernate.Test/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Legacy/MultiTableTest.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using NHibernate.Dialect; using NHibernate.DomainModel; +using NHibernate.Id; using NUnit.Framework; namespace NHibernate.Test.Legacy @@ -613,7 +614,7 @@ public void MultiTableNativeId() [Test] public void Collection() { - if (!TestDialect.SupportsEmptyInserts) + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) { Assert.Ignore("Empty inserts are not supported by the current dialect."); } diff --git a/src/NHibernate.Test/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Legacy/ParentChildTest.cs index 32ae9f6207b..599b36a6686 100644 --- a/src/NHibernate.Test/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Legacy/ParentChildTest.cs @@ -15,7 +15,7 @@ public class ParentChildTest : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs index e15e5d18385..e400f72cd3a 100644 --- a/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/CollectionFixture.cs @@ -1,6 +1,4 @@ -using System; using System.Collections; -using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -28,7 +26,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs index 91e6ecc0be6..713c96c5784 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/Associations/BiM21/Fixture.cs @@ -1,6 +1,4 @@ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.Associations.BiM21 @@ -20,7 +18,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs index 13542710eed..5460d27ed96 100644 --- a/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Docs/ExampleParentChild/UpdateFixture.cs @@ -1,6 +1,4 @@ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Docs.ExampleParentChild @@ -20,7 +18,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs index fc54fae541f..4e957f99ba6 100644 --- a/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/GH1565/LockEntityWithOuterJoinTest.cs @@ -1,5 +1,4 @@ -using NHibernate.Dialect; -using NUnit.Framework; +using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.GH1565 { @@ -48,7 +47,7 @@ protected override void OnTearDown() protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } } diff --git a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs index e835e85c052..f131bf5cf3f 100644 --- a/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/LazyLoadBugTest.cs @@ -1,6 +1,4 @@ -using System; using System.Collections; -using NHibernate.Dialect; using NHibernate.DomainModel.NHSpecific; using NUnit.Framework; @@ -16,7 +14,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs index 7be42e20411..d6709f8dadd 100644 --- a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Text; -using log4net.Appender; -using log4net.Core; -using log4net.Repository.Hierarchy; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.ListsWithHoles @@ -16,7 +9,7 @@ public class Fixture : TestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override IList Mappings diff --git a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index 664838d14a8..3d8d99a27db 100644 --- a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -1,5 +1,3 @@ -using NHibernate.Dialect; - namespace NHibernate.Test.NHSpecificTest.LoadingNullEntityInSet { using System.Collections; @@ -25,7 +23,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override DebugSessionFactory BuildSessionFactory() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs index d054c19dc15..529b7909599 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1301/Fixture.cs @@ -1,4 +1,3 @@ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1301 @@ -13,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs index 05ea0aa769c..7a7afd596e4 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1388/Fixture.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1388 @@ -40,7 +39,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs index b9c7242ccaa..7da77c773ad 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -9,7 +7,7 @@ public class Fixture1 : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } /// diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs index 3f2cec67add..be4f111ad69 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1601 @@ -9,7 +7,7 @@ public class Fixture2 : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } /// diff --git a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs index 2b78ee00ec6..29b904f7669 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs @@ -1,7 +1,5 @@ using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; -using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1609 @@ -16,7 +14,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs index 07d082d35ba..00132cfed28 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1691/Fixture.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1691 @@ -9,7 +8,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private static Component GetInitializedComponent() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs index 2f92a37f2d7..08f77492243 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs @@ -1,6 +1,4 @@ using System.Collections; -using NHibernate.Dialect; -using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1869 @@ -17,7 +15,7 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnTearDown() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs index 2b255447aa2..529347170bb 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1914/Fixture.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1914 @@ -10,7 +9,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs index 9c1d86c895a..2ad2d25d5dc 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2328/Fixture.cs @@ -1,6 +1,4 @@ using System.Linq; -using NHibernate.Dialect; -using NHibernate.Linq; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2328 @@ -10,7 +8,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs index 2c59c099c9e..af5110215ba 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2409/Fixture.cs @@ -1,7 +1,5 @@ -using System; using System.Linq; using NHibernate.Criterion; -using NHibernate.Dialect; using NHibernate.SqlCommand; using NUnit.Framework; @@ -12,7 +10,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs index 4f15bfff32f..418d30fd051 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2703/Fixture.cs @@ -1,4 +1,3 @@ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2703 @@ -10,7 +9,7 @@ public class Fixture : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs index 5202eb42b4f..b785a9c3976 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using NHibernate.Dialect; using NHibernate.Linq; using NUnit.Framework; @@ -22,7 +21,7 @@ private static IEnumerable GetAndFetch(string name, ISession session) wher protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs index a0bb48f7a92..15faa2cec75 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs @@ -6,12 +6,10 @@ using System.Threading.Tasks; using NHibernate.Engine.Query; -using NHibernate.Linq; using NHibernate.Util; using NUnit.Framework; using System.Linq; -using NHibernate.Dialect; namespace NHibernate.Test.NHSpecificTest.NH3050 { @@ -20,7 +18,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs index 262f46df5b7..a1dfcdef4e3 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3141/ProxyIdFixture.cs @@ -1,6 +1,5 @@ using System; using System.Diagnostics; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3141 @@ -12,7 +11,7 @@ public class ProxyIdFixture : BugTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs index d1be2d2364d..2adcae544c5 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH315/Fixture.cs @@ -1,5 +1,4 @@ using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH315 @@ -17,7 +16,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs index 611bca6e56a..8f7be2d7286 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs index e8bbd6fc941..c40c1d4b6f2 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH440/Fixture.cs @@ -1,6 +1,4 @@ -using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH440 @@ -24,7 +22,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } diff --git a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs index 472bcf6f82b..e80bef95b52 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH473/Fixture.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using NHibernate.Dialect; -using NUnit.Framework; +using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH473 { @@ -11,7 +7,7 @@ public class Fixture:BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs index 9950a702257..d88498d957e 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH479/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH479 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs index 1df3b019854..6333bcf5a36 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH521/Fixture.cs @@ -1,4 +1,3 @@ -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH521 @@ -13,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs index 7515a9114a9..756e1da1252 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH607/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH607 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs index be423fa4268..e2fe3b8dbfc 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH643/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH643 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private object parentId; diff --git a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs index 19368f62cd4..4fd1bca6d9b 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH687/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH687 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs index ae19d40be4d..e539583d2e5 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH704/Fixture.cs @@ -1,5 +1,3 @@ -using System; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH704 @@ -14,7 +12,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs index a9a6ae43cbe..1c5d0c6d210 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH826/Fixture.cs @@ -1,5 +1,4 @@ using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH826 @@ -9,7 +8,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs index 6ad058d88ce..52dafb0a139 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH830/AutoFlushTestFixture.cs @@ -1,6 +1,5 @@ using System.Collections; using NHibernate.Criterion; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH830 @@ -10,7 +9,7 @@ public class AutoFlushTestFixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs index ba928b17819..978de34368d 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH898/NH898Fixture.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH898 @@ -24,7 +23,7 @@ protected override IList Mappings protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index 760ff6fff1e..9ca38f7a53d 100644 --- a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -1,5 +1,4 @@ using NHibernate.Cfg; -using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; using NUnit.Framework; @@ -27,7 +26,7 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } [Test] diff --git a/src/NHibernate.Test/Operations/MergeFixture.cs b/src/NHibernate.Test/Operations/MergeFixture.cs index 3f8101980ba..7cc1294428c 100644 --- a/src/NHibernate.Test/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Operations/MergeFixture.cs @@ -11,7 +11,7 @@ public class MergeFixture : AbstractOperationTestCase protected override bool AppliesTo(Dialect.Dialect dialect) { return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - TestDialect.SupportsEmptyInserts; + (TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator); } protected override void OnTearDown() diff --git a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs index 4c7fed19153..c20e8c2bea6 100644 --- a/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs +++ b/src/NHibernate.Test/Stateless/StatelessSessionQueryFixture.cs @@ -1,6 +1,5 @@ using System.Collections; using NHibernate.Cfg; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.Stateless @@ -26,7 +25,7 @@ protected override void Configure(Configuration configuration) protected override bool AppliesTo(Dialect.Dialect dialect) { - return TestDialect.SupportsEmptyInserts; + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } private class TestData diff --git a/src/NHibernate.Test/TestDialect.cs b/src/NHibernate.Test/TestDialect.cs index 68efde5d7f3..050d065c21b 100644 --- a/src/NHibernate.Test/TestDialect.cs +++ b/src/NHibernate.Test/TestDialect.cs @@ -1,4 +1,5 @@ using System; +using NHibernate.Id; using NHibernate.SqlTypes; namespace NHibernate.Test @@ -58,6 +59,16 @@ public TestDialect(Dialect.Dialect dialect) /// public virtual bool SupportsEmptyInserts => true; + /// + /// Either supports inserting in a table without any column specified in the insert, or has a native + /// generator strategy resolving to something else than identity. + /// + /// This property is useful for cases where empty inserts happens only when the entities + /// generator is native while the dialect uses identity for this generator. + public bool SupportsEmptyInsertsOrHasNonIdentityNativeGenerator + => SupportsEmptyInserts || _dialect.NativeIdentifierGeneratorClass != typeof(IdentityGenerator); + + /// /// Supports condition not bound to any data, like "where @p1 = @p2". /// From e07c6ced6657494acc3b10e338e8759ed54251da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Wed, 25 Apr 2018 19:29:47 +0200 Subject: [PATCH 05/12] Adjust code according to review Partially address the review. --- src/NHibernate.Config.Templates/HANA.cfg.xml | 5 +- .../Lambda/FunctionsIntegrationFixture.cs | 5 - .../Criteria/Lambda/IntegrationFixture.cs | 8 +- .../Lambda/ProjectIntegrationFixture.cs | 5 - .../Lambda/SimpleIntegrationFixture.cs | 5 - .../Lambda/SubQueryIntegrationFixture.cs | 5 - .../Async/GenericTest/Overall/Fixture.cs | 9 +- .../Async/Legacy/FooBarTest.cs | 6 - src/NHibernate.Test/Async/Legacy/FumTest.cs | 5 - .../Async/Legacy/MasterDetailTest.cs | 29 ++++- .../Async/Legacy/MultiTableTest.cs | 31 ++--- .../Async/Legacy/ParentChildTest.cs | 23 +++- .../Async/NHSpecificTest/NH1192/Fixture.cs | 3 +- .../Async/NHSpecificTest/NH1609/Fixture.cs | 6 +- .../Async/NHSpecificTest/NH1775/Fixture.cs | 3 +- .../Async/NHSpecificTest/NH1869/Fixture.cs | 6 +- .../Async/NHSpecificTest/NH2705/Test.cs | 5 - .../Async/NHSpecificTest/NH3050/Fixture.cs | 7 +- .../Async/NHSpecificTest/NH386/Fixture.cs | 6 +- .../Properties/CompositePropertyRefTest.cs | 6 - .../Properties/DynamicEntityTest.cs | 6 - .../SqlConverterAndMultiQuery/Fixture.cs | 5 - .../Async/Operations/MergeFixture.cs | 9 +- .../SystemTransactionFixture.cs | 10 +- .../Lambda/FunctionsIntegrationFixture.cs | 5 - .../Criteria/Lambda/IntegrationFixture.cs | 8 +- .../Lambda/ProjectIntegrationFixture.cs | 5 - .../Lambda/SimpleIntegrationFixture.cs | 5 - .../Lambda/SubQueryIntegrationFixture.cs | 5 - .../FunctionTests/SubstringSupportFixture.cs | 36 +++--- .../GenericTest/Overall/Fixture.cs | 9 +- src/NHibernate.Test/Legacy/FooBarTest.cs | 6 - src/NHibernate.Test/Legacy/FumTest.cs | 5 - .../Legacy/MasterDetailTest.cs | 29 ++++- src/NHibernate.Test/Legacy/MultiTableTest.cs | 31 ++--- src/NHibernate.Test/Legacy/ParentChildTest.cs | 23 +++- .../NHSpecificTest/NH1192/Fixture.cs | 3 +- .../NHSpecificTest/NH1609/Fixture.cs | 6 +- .../NHSpecificTest/NH1775/Fixture.cs | 3 +- .../NHSpecificTest/NH1812/Fixture.cs | 4 +- .../NHSpecificTest/NH1869/Fixture.cs | 6 +- .../NHSpecificTest/NH2705/Test.cs | 5 - .../NHSpecificTest/NH3050/Fixture.cs | 6 +- .../NHSpecificTest/NH386/Fixture.cs | 6 +- .../Properties/CompositePropertyRefTest.cs | 6 - .../Properties/DynamicEntityTest.cs | 6 - .../SqlConverterAndMultiQuery/Fixture.cs | 5 - .../Operations/MergeFixture.cs | 9 +- .../SystemTransactionFixture.cs | 10 +- .../SystemTransactionFixtureBase.cs | 10 +- .../TransactionNotificationFixture.cs | 1 - src/NHibernate/Dialect/AbstractHanaDialect.cs | 110 ++++++------------ src/NHibernate/Driver/HanaDriver.cs | 23 ++-- 53 files changed, 238 insertions(+), 356 deletions(-) diff --git a/src/NHibernate.Config.Templates/HANA.cfg.xml b/src/NHibernate.Config.Templates/HANA.cfg.xml index 1efeab70083..539e2db7688 100644 --- a/src/NHibernate.Config.Templates/HANA.cfg.xml +++ b/src/NHibernate.Config.Templates/HANA.cfg.xml @@ -7,8 +7,11 @@ for your own use before compile tests in VisualStudio. NHibernate.Driver.HanaDriver + - Server=localhost:39015;UserID=nhibernate;Password= + Server=localhost:39015;UserID=nhibernate;Password=; + Enlist=false; NHibernate.Dialect.HanaColumnStoreDialect diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs index 6171cad68be..0b1cc1609ab 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -19,11 +19,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class FunctionsIntegrationFixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly => "NHibernate.Test"; protected override IList Mappings => new[] { "Criteria.Lambda.Mappings.hbm.xml" }; diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs index 443a327f0fa..434563e7856 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/IntegrationFixture.cs @@ -24,11 +24,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class IntegrationFixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } } protected override IList Mappings @@ -269,6 +264,9 @@ public async Task IsTypeAsync() [Test] public async Task OverrideEagerJoinAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + using (ISession s = OpenSession()) using (ITransaction t = s.BeginTransaction()) { diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs index 26b19b1432b..dc73994e402 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -20,11 +20,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class ProjectIntegrationFixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs index 0c49f9c1c1c..79de02dd0ca 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -17,11 +17,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SimpleIntegrationFixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs index 3e36927db22..598072d78ca 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -19,11 +19,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SubQueryIntegrationFixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs index 13d187fa3c1..4293af51d2a 100644 --- a/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/Async/GenericTest/Overall/Fixture.cs @@ -11,6 +11,7 @@ using System; using System.Collections; using System.Collections.Generic; + using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -19,11 +20,6 @@ namespace NHibernate.Test.GenericTest.Overall [TestFixture] public class FixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get { return new[] { "GenericTest.Overall.Mappings.hbm.xml" }; } @@ -57,6 +53,9 @@ public async Task CRUDAsync() [Test] public async Task CRUDABAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + var entity = new A { Property = new B { Prop = 2 }, diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index 18f6546237b..d148a732bf6 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -24,7 +24,6 @@ using NHibernate.Dialect; using NHibernate.DomainModel; using NHibernate.Criterion; -using NHibernate.Id; using NHibernate.Proxy; using NHibernate.Type; using NHibernate.Util; @@ -43,11 +42,6 @@ private static byte[] GetBytes(string str) return Encoding.Unicode.GetBytes(str); } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get diff --git a/src/NHibernate.Test/Async/Legacy/FumTest.cs b/src/NHibernate.Test/Async/Legacy/FumTest.cs index faad72c71ee..a947a8a1229 100644 --- a/src/NHibernate.Test/Async/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FumTest.cs @@ -29,11 +29,6 @@ public class FumTestAsync : TestCase { protected static short fumKeyShort = 1; - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get diff --git a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs index 2167e46746b..4482ecdf91d 100644 --- a/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MasterDetailTest.cs @@ -30,11 +30,6 @@ namespace NHibernate.Test.Legacy [TestFixture] public class MasterDetailTestAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get @@ -57,6 +52,9 @@ protected override IList Mappings [Test] public async Task ParentChildrenAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession session = OpenSession(); M parent = new M(); @@ -847,6 +845,9 @@ public async Task MixNativeAssignedAsync() [Test] public async Task CollectionReplaceOnUpdateAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -892,6 +893,9 @@ public async Task CollectionReplaceOnUpdateAsync() [Test] public async Task CollectionReplace2Async() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -931,6 +935,9 @@ public async Task CollectionReplace2Async() [Test] public async Task CollectionReplaceAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -976,6 +983,9 @@ public async Task CollectionReplaceAsync() [Test] public async Task CategoriesAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + Category c = new Category(); c.Name = Category.RootCategory; Category c1 = new Category(); @@ -1017,6 +1027,9 @@ public async Task CategoriesAsync() [Test] public async Task CollectionRefreshAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Category c = new Category(); IList list = new List(); @@ -1060,6 +1073,9 @@ public async Task CollectionRefreshAsync() [Test] public async Task CachedCollectionRefreshAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Category c = new Category(); IList list = new List(); @@ -1245,6 +1261,9 @@ public async Task QueuedBagAddsAsync() [Test] public async Task PolymorphicCriteriaAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction txn = s.BeginTransaction(); Category f = new Category(); diff --git a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs index a8fb29df901..9de4245ea43 100644 --- a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs @@ -13,7 +13,6 @@ using System.Collections.Generic; using NHibernate.Dialect; using NHibernate.DomainModel; -using NHibernate.Id; using NUnit.Framework; namespace NHibernate.Test.Legacy @@ -149,7 +148,7 @@ public async Task QueriesAsync() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = (long) await (s.SaveAsync(new TrivialClass())); } @@ -185,7 +184,7 @@ public async Task ConstraintsAsync() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { await (s.SaveAsync(sm)); } @@ -206,11 +205,6 @@ public async Task ConstraintsAsync() [Test] public async Task MultiTableAsync() { - if (Dialect is AbstractHanaDialect) - { - Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); - } - ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -221,7 +215,7 @@ public async Task MultiTableAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -236,7 +230,7 @@ public async Task MultiTableAsync() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { smid = await (s.SaveAsync(sm)); } @@ -346,11 +340,6 @@ public async Task MultiTableAsync() [Test] public async Task MultiTableGeneratedIdAsync() { - if (Dialect is AbstractHanaDialect) - { - Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); - } - ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -475,7 +464,7 @@ public async Task MultiTableCollectionsAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -495,7 +484,7 @@ public async Task MultiTableCollectionsAsync() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = await (s.SaveAsync(ls)); } @@ -552,7 +541,7 @@ public async Task MultiTableManyToOneAsync() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = await (s.SaveAsync(multi)); } @@ -567,7 +556,7 @@ public async Task MultiTableManyToOneAsync() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = await (s.SaveAsync(ls)); } @@ -614,9 +603,7 @@ public async Task MultiTableNativeIdAsync() public async Task CollectionAsync() { if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) - { - Assert.Ignore("Empty inserts are not supported by the current dialect."); - } + Assert.Ignore("Support of empty inserts is required"); ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); diff --git a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs index 4d6fb4c0ad6..5a6f6b6fd10 100644 --- a/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Async/Legacy/ParentChildTest.cs @@ -24,11 +24,6 @@ namespace NHibernate.Test.Legacy [TestFixture] public class ParentChildTestAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get @@ -60,6 +55,9 @@ protected override IList Mappings [Test] public async Task ReplicateAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Container baz = new Container(); Contained f = new Contained(); @@ -358,6 +356,9 @@ public async Task ClassWhereAsync() [Test] public async Task CollectionQueryAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); @@ -515,6 +516,9 @@ public async Task ParentNullChildAsync() [Test] public async Task ManyToManyAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + // if( dialect is Dialect.HSQLDialect) return; ISession s = OpenSession(); @@ -572,6 +576,9 @@ public async Task ManyToManyAsync() [Test] public async Task ContainerAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Container c = new Container(); @@ -704,6 +711,9 @@ public async Task ContainerAsync() [Test] public async Task CascadeCompositeElementsAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + Container c = new Container(); c.Cascades = new List(); @@ -765,6 +775,9 @@ public async Task CascadeCompositeElementsAsync() [Test] public async Task BagAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + //if( dialect is Dialect.HSQLDialect ) return; ISession s = OpenSession(); diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs index 63f37734afa..84a4c2c6398 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1192/Fixture.cs @@ -19,8 +19,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect) && - !(dialect is AbstractHanaDialect); + return !(dialect is Oracle8iDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs index 6975d2d08eb..f64a4444dbd 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1609/Fixture.cs @@ -10,6 +10,7 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1609 @@ -24,11 +25,6 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public async Task TestAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs index 4af86b32fc8..b0a6bdf6017 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1775/Fixture.cs @@ -20,8 +20,7 @@ public class FixtureAsync : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect) && - !(dialect is AbstractHanaDialect); + return !(dialect is Oracle8iDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs index 65a85dd5188..0137e1fcc94 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1869/Fixture.cs @@ -9,6 +9,7 @@ using System.Collections; +using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1869 @@ -25,11 +26,6 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override void OnTearDown() { using (var session = Sfi.OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs index 6ec92361ac0..f81135448a8 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2705/Test.cs @@ -31,11 +31,6 @@ public class TestAsync : BugTestCase .Where(p => p.SubItem.Name == name).ToListAsync(cancellationToken)); } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void Fetch_OnComponent_ShouldNotThrowAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs index 2bcaaeee0e9..c8aedc6450f 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3050/Fixture.cs @@ -16,22 +16,17 @@ using System.Threading.Tasks; using NHibernate.Engine.Query; +using NHibernate.Linq; using NHibernate.Util; using NUnit.Framework; using System.Linq; -using NHibernate.Linq; namespace NHibernate.Test.NHSpecificTest.NH3050 { [TestFixture] public class FixtureAsync : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public async Task TestAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs index 5ac63fcbe84..96f71b7d62d 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH386/Fixture.cs @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ +using System; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -21,11 +22,6 @@ public override string BugNumber get { return "NH386"; } } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public async Task QueryAsync() { diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs index 953ba87799b..35d73040c17 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -10,7 +10,6 @@ using System; using System.Linq; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -22,11 +21,6 @@ public class CompositePropertyRefTestAsync : BugTestCase private long p_id; private long p2_id; - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns - } - protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs index e0032c363dc..90fa8b3a468 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -10,7 +10,6 @@ using System.Collections; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -19,11 +18,6 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTestAsync : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns - } - protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index a01b630215d..fc8c339848e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -35,11 +35,6 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver is SqlClientDriver; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void NormalHqlShouldThrowUserExceptionAsync() { diff --git a/src/NHibernate.Test/Async/Operations/MergeFixture.cs b/src/NHibernate.Test/Async/Operations/MergeFixture.cs index 493041c82a0..125950bd47d 100644 --- a/src/NHibernate.Test/Async/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Async/Operations/MergeFixture.cs @@ -22,8 +22,7 @@ public class MergeFixtureAsync : AbstractOperationTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - (TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator); + return !(dialect is Dialect.FirebirdDialect); // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture } protected override void OnTearDown() @@ -400,6 +399,9 @@ public async Task MergeManagedAsync() [Test] public async Task MergeManyToManyWithCollectionDeferenceAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + // setup base data... Competition competition; using (ISession s = OpenSession()) @@ -824,6 +826,9 @@ public async Task PersistThenMergeInSameTxnWithVersionAsync() [Test] public async Task RecursiveMergeTransientAsync() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + using (ISession s = OpenSession()) { using (ITransaction tx = s.BeginTransaction()) diff --git a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs index c9dc337df13..fa4b3af96d9 100644 --- a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs +++ b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs @@ -190,8 +190,14 @@ public async Task CanUseSessionWithManyScopesAsync(bool explicitFlush) // ODBC with SQL-Server always causes scopes to go distributed, which causes their transaction completion to run // asynchronously. But ODBC enlistment also check the previous transaction in a way that do not guard against it // being concurrently disposed of. See https://github.com/nhibernate/nhibernate-core/pull/1505 for more details. - Assume.That(!(Sfi.ConnectionProvider.Driver is OdbcDriver), - "ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception"); + if (Sfi.ConnectionProvider.Driver is OdbcDriver) + Assert.Ignore("ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception"); + // SAP HANA .Net provider always causes system transactions to be distributed, causing them to complete + // on concurrent threads. This creates race conditions when chaining scopes, the subsequent scope usage + // finding the connection still enlisted in the previous transaction, its complete being still not finished + // on its own thread. + if (Sfi.ConnectionProvider.Driver is HanaDriver) + Assert.Ignore("SAP HANA scope handling causes concurrency issues preventing chaining scope usages."); using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession()) { diff --git a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs index 6834278c7d9..4ae52757192 100644 --- a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -8,11 +8,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class FunctionsIntegrationFixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly => "NHibernate.Test"; protected override IList Mappings => new[] { "Criteria.Lambda.Mappings.hbm.xml" }; diff --git a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs index e42198acbb0..6adbb11f0b1 100644 --- a/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs @@ -12,11 +12,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class IntegrationFixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } } protected override IList Mappings @@ -257,6 +252,9 @@ public void IsType() [Test] public void OverrideEagerJoin() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + using (ISession s = OpenSession()) using (ITransaction t = s.BeginTransaction()) { diff --git a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs index ce7ffd9048e..f6b5d7d9c3a 100644 --- a/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/ProjectIntegrationFixture.cs @@ -9,11 +9,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class ProjectIntegrationFixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs index a7d39714b0c..1cdd44c982a 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SimpleIntegrationFixture.cs @@ -6,11 +6,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SimpleIntegrationFixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs index e8e1beb9243..55d1a1e5f43 100644 --- a/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs @@ -8,11 +8,6 @@ namespace NHibernate.Test.Criteria.Lambda [TestFixture] public class SubQueryIntegrationFixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override string MappingsAssembly { get { return "NHibernate.Test"; } diff --git a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs index 38f422d739c..a524d160a7e 100644 --- a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs +++ b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs @@ -34,20 +34,28 @@ public void DialectShouldUseCorrectSubstringImplementation(System.Type dialectTy var substringFunction = dialect.Functions["substring"]; - if (dialect is MsSql2000Dialect || dialect is MsSqlCeDialect || dialect is SybaseASE15Dialect) - Assert.That(substringFunction, Is.TypeOf()); - else if (dialect is DB2Dialect) - Assert.That(substringFunction, Is.TypeOf()); - else if (dialect is SybaseSQLAnywhere10Dialect) - Assert.That(substringFunction, Is.TypeOf()); - else if (dialect is Oracle8iDialect) - Assert.That(substringFunction, Is.TypeOf()); - else if (dialect is SQLiteDialect) - Assert.That(substringFunction, Is.TypeOf()); - else if (dialect is AbstractHanaDialect) - Assert.That(substringFunction, Is.TypeOf()); - else - Assert.That(substringFunction, Is.TypeOf()); + switch (dialect) + { + case MsSql2000Dialect _: + case MsSqlCeDialect _: + case SybaseASE15Dialect _: + Assert.That(substringFunction, Is.TypeOf()); + break; + case DB2Dialect _: + Assert.That(substringFunction, Is.TypeOf()); + break; + case SybaseSQLAnywhere10Dialect _: + Assert.That(substringFunction, Is.TypeOf()); + break; + case Oracle8iDialect _: + case SQLiteDialect _: + case AbstractHanaDialect _: + Assert.That(substringFunction, Is.TypeOf()); + break; + default: + Assert.That(substringFunction, Is.TypeOf()); + break; + } } } diff --git a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs index 9b804951520..95d1f068b4a 100644 --- a/src/NHibernate.Test/GenericTest/Overall/Fixture.cs +++ b/src/NHibernate.Test/GenericTest/Overall/Fixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; + using NUnit.Framework; namespace NHibernate.Test.GenericTest.Overall @@ -8,11 +9,6 @@ namespace NHibernate.Test.GenericTest.Overall [TestFixture] public class Fixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get { return new[] { "GenericTest.Overall.Mappings.hbm.xml" }; } @@ -46,6 +42,9 @@ public void CRUD() [Test] public void CRUDAB() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + var entity = new A { Property = new B { Prop = 2 }, diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 80e319046ca..0a05c46e884 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -14,7 +14,6 @@ using NHibernate.Dialect; using NHibernate.DomainModel; using NHibernate.Criterion; -using NHibernate.Id; using NHibernate.Proxy; using NHibernate.Type; using NHibernate.Util; @@ -31,11 +30,6 @@ private static byte[] GetBytes(string str) return Encoding.Unicode.GetBytes(str); } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get diff --git a/src/NHibernate.Test/Legacy/FumTest.cs b/src/NHibernate.Test/Legacy/FumTest.cs index c25d00fd12c..d1373873159 100644 --- a/src/NHibernate.Test/Legacy/FumTest.cs +++ b/src/NHibernate.Test/Legacy/FumTest.cs @@ -18,11 +18,6 @@ public class FumTest : TestCase { protected static short fumKeyShort = 1; - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get diff --git a/src/NHibernate.Test/Legacy/MasterDetailTest.cs b/src/NHibernate.Test/Legacy/MasterDetailTest.cs index fde99165dcb..5b6fb4eba27 100644 --- a/src/NHibernate.Test/Legacy/MasterDetailTest.cs +++ b/src/NHibernate.Test/Legacy/MasterDetailTest.cs @@ -19,11 +19,6 @@ namespace NHibernate.Test.Legacy [TestFixture] public class MasterDetailTest : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get @@ -46,6 +41,9 @@ protected override IList Mappings [Test] public void ParentChildren() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession session = OpenSession(); M parent = new M(); @@ -846,6 +844,9 @@ public void MixNativeAssigned() [Test] public void CollectionReplaceOnUpdate() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -891,6 +892,9 @@ public void CollectionReplaceOnUpdate() [Test] public void CollectionReplace2() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -930,6 +934,9 @@ public void CollectionReplace2() [Test] public void CollectionReplace() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Category c = new Category(); @@ -975,6 +982,9 @@ public void CollectionReplace() [Test] public void Categories() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + Category c = new Category(); c.Name = Category.RootCategory; Category c1 = new Category(); @@ -1016,6 +1026,9 @@ public void Categories() [Test] public void CollectionRefresh() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Category c = new Category(); IList list = new List(); @@ -1059,6 +1072,9 @@ public void CollectionRefresh() [Test] public void CachedCollectionRefresh() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Category c = new Category(); IList list = new List(); @@ -1244,6 +1260,9 @@ public void QueuedBagAdds() [Test] public void PolymorphicCriteria() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction txn = s.BeginTransaction(); Category f = new Category(); diff --git a/src/NHibernate.Test/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Legacy/MultiTableTest.cs index 8c740cb7cce..dadb6f2c120 100644 --- a/src/NHibernate.Test/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Legacy/MultiTableTest.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using NHibernate.Dialect; using NHibernate.DomainModel; -using NHibernate.Id; using NUnit.Framework; namespace NHibernate.Test.Legacy @@ -150,7 +149,7 @@ public void Queries() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = (long) s.Save(new TrivialClass()); } @@ -186,7 +185,7 @@ public void Constraints() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { s.Save(sm); } @@ -207,11 +206,6 @@ public void Constraints() [Test] public void MultiTable() { - if (Dialect is AbstractHanaDialect) - { - Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); - } - ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -222,7 +216,7 @@ public void MultiTable() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = s.Save(multi); sid = s.Save(simp); @@ -237,7 +231,7 @@ public void MultiTable() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { smid = s.Save(sm); } @@ -347,11 +341,6 @@ public void MultiTable() [Test] public void MultiTableGeneratedId() { - if (Dialect is AbstractHanaDialect) - { - Assert.Ignore("feature not supported: Currently specify table name by 'FOR UPDATE of t1.c1' if there are more than one tables/views/subqueries in the FROM clause"); - } - ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Multi multi = new Multi(); @@ -476,7 +465,7 @@ public void MultiTableCollections() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = s.Save(multi); sid = s.Save(simp); @@ -496,7 +485,7 @@ public void MultiTableCollections() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = s.Save(ls); } @@ -553,7 +542,7 @@ public void MultiTableManyToOne() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { mid = s.Save(multi); } @@ -568,7 +557,7 @@ public void MultiTableManyToOne() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect || Dialect is AbstractHanaDialect) + if (Dialect is MsSql2000Dialect) { id = s.Save(ls); } @@ -615,9 +604,7 @@ public void MultiTableNativeId() public void Collection() { if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) - { - Assert.Ignore("Empty inserts are not supported by the current dialect."); - } + Assert.Ignore("Support of empty inserts is required"); ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); diff --git a/src/NHibernate.Test/Legacy/ParentChildTest.cs b/src/NHibernate.Test/Legacy/ParentChildTest.cs index 599b36a6686..2790357ad8a 100644 --- a/src/NHibernate.Test/Legacy/ParentChildTest.cs +++ b/src/NHibernate.Test/Legacy/ParentChildTest.cs @@ -13,11 +13,6 @@ namespace NHibernate.Test.Legacy [TestFixture] public class ParentChildTest : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override IList Mappings { get @@ -49,6 +44,9 @@ protected override IList Mappings [Test] public void Replicate() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); Container baz = new Container(); Contained f = new Contained(); @@ -347,6 +345,9 @@ public void ClassWhere() [Test] public void CollectionQuery() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); @@ -504,6 +505,9 @@ public void ParentNullChild() [Test] public void ManyToMany() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + // if( dialect is Dialect.HSQLDialect) return; ISession s = OpenSession(); @@ -561,6 +565,9 @@ public void ManyToMany() [Test] public void Container() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + ISession s = OpenSession(); ITransaction t = s.BeginTransaction(); Container c = new Container(); @@ -693,6 +700,9 @@ public void Container() [Test] public void CascadeCompositeElements() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + Container c = new Container(); c.Cascades = new List(); @@ -754,6 +764,9 @@ public void CascadeCompositeElements() [Test] public void Bag() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + //if( dialect is Dialect.HSQLDialect ) return; ISession s = OpenSession(); diff --git a/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs index 40f8cc5770e..26f65d86db1 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1192/Fixture.cs @@ -8,8 +8,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect) && - !(dialect is AbstractHanaDialect); + return !(dialect is Oracle8iDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs index 29b904f7669..6b8141f40db 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1609/Fixture.cs @@ -1,5 +1,6 @@ using System.Collections; using NHibernate.Criterion; +using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1609 @@ -12,11 +13,6 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void Test() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs index 843d320589e..d8aa1826874 100755 --- a/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1775/Fixture.cs @@ -9,8 +9,7 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect) && - !(dialect is AbstractHanaDialect); + return !(dialect is Oracle8iDialect); } protected override void OnSetUp() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1812/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1812/Fixture.cs index 2d71ab1fc44..0eca9db58c0 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1812/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1812/Fixture.cs @@ -38,7 +38,7 @@ left outer join p.PeriodCollection p1 protected override bool AppliesTo(Dialect.Dialect dialect) { - return Dialect.SupportsScalarSubSelects; + return Dialect.SupportsScalarSubSelects && TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override void OnTearDown() @@ -53,4 +53,4 @@ protected override void OnTearDown() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs index 08f77492243..db540190871 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1869/Fixture.cs @@ -1,4 +1,5 @@ using System.Collections; +using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1869 @@ -13,11 +14,6 @@ protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver.SupportsMultipleQueries; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - protected override void OnTearDown() { using (var session = Sfi.OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs index b785a9c3976..bec7503160f 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2705/Test.cs @@ -19,11 +19,6 @@ private static IEnumerable GetAndFetch(string name, ISession session) wher .Where(p => p.SubItem.Name == name).ToList(); } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void Fetch_OnComponent_ShouldNotThrow() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs index 15faa2cec75..ef66f7cb5ef 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3050/Fixture.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using NHibernate.Engine.Query; +using NHibernate.Linq; using NHibernate.Util; using NUnit.Framework; @@ -16,11 +17,6 @@ namespace NHibernate.Test.NHSpecificTest.NH3050 [TestFixture] public class Fixture : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void Test() { diff --git a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs index 8f7be2d7286..10352cac845 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH386/Fixture.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH386 @@ -10,11 +11,6 @@ public override string BugNumber get { return "NH386"; } } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void Query() { diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs index bdfccc2e5af..77893017777 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -11,11 +10,6 @@ public class CompositePropertyRefTest : BugTestCase private long p_id; private long p2_id; - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns - } - protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs index 7481b3215f4..7c5a7ba4b16 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -1,6 +1,5 @@ using System.Collections; using System.Collections.Generic; -using NHibernate.Dialect; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.Properties @@ -8,11 +7,6 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTest : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return !(dialect is AbstractHanaDialect); // HANA doesn't support foreign key constraints over unique key columns - } - protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs index 9ca38f7a53d..5d822391ca9 100644 --- a/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/SqlConverterAndMultiQuery/Fixture.cs @@ -24,11 +24,6 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory) return factory.ConnectionProvider.Driver is SqlClientDriver; } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - [Test] public void NormalHqlShouldThrowUserException() { diff --git a/src/NHibernate.Test/Operations/MergeFixture.cs b/src/NHibernate.Test/Operations/MergeFixture.cs index 7cc1294428c..66c4367f82d 100644 --- a/src/NHibernate.Test/Operations/MergeFixture.cs +++ b/src/NHibernate.Test/Operations/MergeFixture.cs @@ -10,8 +10,7 @@ public class MergeFixture : AbstractOperationTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Dialect.FirebirdDialect) && // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture - (TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator); + return !(dialect is Dialect.FirebirdDialect); // Firebird has no CommandTimeout, and locks up during the tear-down of this fixture } protected override void OnTearDown() @@ -362,6 +361,9 @@ public void MergeManaged() [Test] public void MergeManyToManyWithCollectionDeference() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + // setup base data... Competition competition; using (ISession s = OpenSession()) @@ -786,6 +788,9 @@ public void PersistThenMergeInSameTxnWithVersion() [Test] public void RecursiveMergeTransient() { + if (!TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator) + Assert.Ignore("Support of empty inserts is required"); + using (ISession s = OpenSession()) { using (ITransaction tx = s.BeginTransaction()) diff --git a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs index 12c4cc12d1d..781c17631ce 100644 --- a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs +++ b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs @@ -179,8 +179,14 @@ public void CanUseSessionWithManyScopes(bool explicitFlush) // ODBC with SQL-Server always causes scopes to go distributed, which causes their transaction completion to run // asynchronously. But ODBC enlistment also check the previous transaction in a way that do not guard against it // being concurrently disposed of. See https://github.com/nhibernate/nhibernate-core/pull/1505 for more details. - Assume.That(!(Sfi.ConnectionProvider.Driver is OdbcDriver), - "ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception"); + if (Sfi.ConnectionProvider.Driver is OdbcDriver) + Assert.Ignore("ODBC sometimes fails on second scope by checking the previous transaction status, which may yield an object disposed exception"); + // SAP HANA .Net provider always causes system transactions to be distributed, causing them to complete + // on concurrent threads. This creates race conditions when chaining scopes, the subsequent scope usage + // finding the connection still enlisted in the previous transaction, its complete being still not finished + // on its own thread. + if (Sfi.ConnectionProvider.Driver is HanaDriver) + Assert.Ignore("SAP HANA scope handling causes concurrency issues preventing chaining scope usages."); using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession()) { diff --git a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs index 6a13a609c2a..5e587563a64 100644 --- a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs +++ b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixtureBase.cs @@ -39,8 +39,12 @@ protected void DisableConnectionAutoEnlist(Configuration configuration) } // Purge any previous enlist connectionString = Regex.Replace( - connectionString, $"[^;\"a-zA-Z]*{autoEnlistmentKeywordPattern}=[^;\"]*", string.Empty, - RegexOptions.IgnoreCase | RegexOptions.Multiline); + connectionString, $"[^;\"a-zA-Z]*{autoEnlistmentKeywordPattern}=[^;\"]*;?", string.Empty, + RegexOptions.IgnoreCase); + // Avoid redundant semi-colon + connectionString = Regex.Replace( + connectionString, $";[/s]*$", string.Empty, + RegexOptions.IgnoreCase); connectionString += $";{autoEnlistmentKeyword}=false;"; configuration.SetProperty(Cfg.Environment.ConnectionString, connectionString); } @@ -143,4 +147,4 @@ public override void AfterTransactionCompletion(ITransaction tx) } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/SystemTransactions/TransactionNotificationFixture.cs b/src/NHibernate.Test/SystemTransactions/TransactionNotificationFixture.cs index 8960ce31d1b..5a8da0fc3fa 100644 --- a/src/NHibernate.Test/SystemTransactions/TransactionNotificationFixture.cs +++ b/src/NHibernate.Test/SystemTransactions/TransactionNotificationFixture.cs @@ -182,7 +182,6 @@ public void ShouldNotifyAfterDistributedTransactionWithOwnConnection(bool doComm { using (var tx = new TransactionScope()) { - ownConnection1.EnlistTransaction(System.Transactions.Transaction.Current); using (s1 = Sfi.WithOptions().Connection(ownConnection1).Interceptor(interceptor).OpenSession()) { s1.CreateCriteria().List(); diff --git a/src/NHibernate/Dialect/AbstractHanaDialect.cs b/src/NHibernate/Dialect/AbstractHanaDialect.cs index bdc0cdac6b9..8f33c787b79 100644 --- a/src/NHibernate/Dialect/AbstractHanaDialect.cs +++ b/src/NHibernate/Dialect/AbstractHanaDialect.cs @@ -35,59 +35,51 @@ public abstract class AbstractHanaDialect : Dialect [Serializable] private class TypeConvertingVarArgsSQLFunction : ISQLFunction { - private readonly string begin; - private readonly string sep; - private readonly string end; - private SqlType type = null; - private Dialect dialect = null; + private readonly string _begin; + private readonly string _sep; + private readonly string _end; + private SqlType _type; public TypeConvertingVarArgsSQLFunction(string begin, string sep, string end) { - this.begin = begin; - this.sep = sep; - this.end = end; + _begin = begin; + _sep = sep; + _end = end; } #region ISQLFunction Members public IType ReturnType(IType columnType, IMapping mapping) { - type = columnType.SqlTypes(mapping)[0]; - dialect = mapping.Dialect; + _type = columnType.SqlTypes(mapping)[0]; return columnType; } - public bool HasArguments - { - get { return true; } - } + public bool HasArguments => true; - public bool HasParenthesesIfNoArguments - { - get { return true; } - } + public bool HasParenthesesIfNoArguments => true; public SqlString Render(IList args, ISessionFactoryImplementor factory) { - SqlStringBuilder buf = new SqlStringBuilder().Add(begin); - for (int i = 0; i < args.Count; i++) + var buf = new SqlStringBuilder().Add(_begin); + for (var i = 0; i < args.Count; i++) { - object arg = args[i]; - if (arg is SqlString && (arg as SqlString).EqualsCaseInsensitive("?")) + var arg = args[i]; + if (arg is SqlString str && str.EqualsCaseInsensitive("?")) { buf.Add("cast("); buf.AddObject(arg); buf.Add(" as "); - buf.Add(dialect.GetCastTypeName(type)); + buf.Add(factory.Dialect.GetCastTypeName(_type)); buf.Add(")"); } else { buf.AddObject(arg); } - if (i < args.Count - 1) buf.Add(sep); + if (i < args.Count - 1) buf.Add(_sep); } - return buf.Add(end).ToSqlString(); + return buf.Add(_end).ToSqlString(); } #endregion @@ -419,7 +411,6 @@ protected virtual void RegisterNHibernateFunctions() RegisterFunction("chr", new StandardSQLFunction("char", NHibernateUtil.AnsiChar)); RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.Date, "to_date(?1)")); RegisterFunction("iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); - RegisterFunction("Iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end")); RegisterFunction("sysdate", new NoArgSQLFunction("current_timestamp", NHibernateUtil.DateTime, false)); RegisterFunction("truncate", new SQLFunctionTemplateWithRequiredParameters(null, "floor(?1 * power(10, ?2)) / power(10, ?2)", new object[] { null, "0" })); } @@ -636,9 +627,6 @@ public override string GetColumnComment(string comment) /// public override bool SupportsColumnCheck => false; - /// - public override bool SupportsTableCheck => true; - public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) { return new HanaDataBaseSchema(connection); @@ -649,8 +637,7 @@ public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) #region Lock acquisition support /// - [Obsolete("Use UsesColumnsWithForUpdateOf instead")] - public override bool ForUpdateOfColumns => true; + public override bool UsesColumnsWithForUpdateOf => true; /// public override string GetForUpdateString(string aliases) @@ -691,12 +678,6 @@ public override string GenerateTemporaryTableName(string baseTableName) return false; } - /// - public override bool DropTemporaryTableAfterUse() - { - return true; - } - #endregion #endregion @@ -719,15 +700,15 @@ public override int RegisterResultSetOutParameter(DbCommand statement, int posit /// public override long TimestampResolutionInTicks - { - get { return 10L; } // Maximum precision (one tick) - } + // According to https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.02/en-US/3f81ccc7e35d44cbbc595c7d552c202a.html, + // it is supposed to have a 7 digits fractional second precision, but tests show only a 6 digits one. This is maybe a + // limitation of the data provider. + => 10L; #endregion #region Constraint support - /// public override string CascadeConstraintsString { @@ -774,7 +755,10 @@ public override string IdentityColumnString /// public override string GetSequenceNextValString(string sequenceName) { - return "select " + GetSelectSequenceNextValString(sequenceName) + " from dummy"; + // See https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.02/en-US/20d509277519101489029c064d468c5d.html, + // this seems to be the recommended way of querying a sequence. + // SYS.DUMMY is a system table having normally one row. If someone has fiddled with it, this will cause failures... + return "select " + GetSelectSequenceNextValString(sequenceName) + " from sys.dummy"; } /// @@ -803,7 +787,7 @@ protected override string GetCreateSequenceString(string sequenceName, int initi throw new MappingException("Unable to create the sequence [" + sequenceName + "]: the increment size must not be 0"); } - String createSequenceString = GetCreateSequenceString(sequenceName) + " start with " + initialValue + " increment by " + incrementSize; + var createSequenceString = GetCreateSequenceString(sequenceName) + " start with " + initialValue + " increment by " + incrementSize; if (incrementSize > 0) { if (initialValue < 1) @@ -841,9 +825,6 @@ public override string ToBooleanValueString(bool value) return value ? "true" : "false"; } - /// - public override bool SupportsConcurrentWritingConnectionsInSameTransaction => false; - #endregion #region Limit/offset support @@ -882,10 +863,6 @@ public override SqlString GetLimitString(SqlString queryString, SqlString offset #endregion - #region Identifier quoting support - - #endregion - #region Union subclass support /// @@ -946,9 +923,6 @@ public override string GetSelectClauseNullString(SqlType sqlType) /// public override bool SupportsRowValueConstructorSyntaxInInList => true; - /// - public override bool SupportsCircularCascadeDeleteConstraints => false; - /// public override bool SupportsExpectedLobUsagePattern => false; @@ -958,46 +932,28 @@ public override string GetSelectClauseNullString(SqlType sqlType) /// public override bool SupportsExistsInSelect => false; - /// - public override bool SupportsScalarSubSelects => false; - #endregion - /// public override string SelectGUIDString - { - get { return "select sysuuid from dummy"; } - } + // SYS.DUMMY is a system table having normally one row. If someone has fiddled with it, this will cause failures... + => "select sysuuid from sys.dummy"; /// public override bool IsCurrentTimestampSelectStringCallable => false; /// public override string CurrentTimestampSelectString - { - get { return "select current_timestamp from dummy"; } - } - - /// - public override string NoColumnsInsertString - { - get { throw new MappingException("HANA does not support inserting a row without specifying any column values"); } - } + // SYS.DUMMY is a system table having normally one row. If someone has fiddled with it, this will cause failures... + => "select current_timestamp from sys.dummy"; /// public override int MaxAliasLength => 128; /// - public override string AddColumnString - { - get { return "add ("; } - } + public override string AddColumnString => "add ("; /// - public override string AddColumnSuffixString - { - get { return ")"; } - } + public override string AddColumnSuffixString => ")"; } } diff --git a/src/NHibernate/Driver/HanaDriver.cs b/src/NHibernate/Driver/HanaDriver.cs index de7e2af9c10..850b01f6c22 100644 --- a/src/NHibernate/Driver/HanaDriver.cs +++ b/src/NHibernate/Driver/HanaDriver.cs @@ -1,4 +1,3 @@ -using System; using NHibernate.AdoNet; namespace NHibernate.Driver @@ -34,32 +33,34 @@ public HanaDriver() : base( } /// + /// + /// Named parameters are not supported by the SAP HANA .Net provider. + /// https://help.sap.com/viewer/0eec0d68141541d1b07893a39944924e/2.0.02/en-US/d197835a6d611014a07fd73ee6fed6eb.html + /// public override bool UseNamedPrefixInSql => false; /// public override bool UseNamedPrefixInParameter => false; /// - public override string NamedPrefix => String.Empty; - - public override bool SupportsMultipleOpenReaders => false; + public override string NamedPrefix => string.Empty; public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplementor session) { return new BasicResultSetsCommand(session); } - public override bool SupportsSystemTransactions => true; - + /// + /// It does support it indeed, provided any previous transaction has finished completing. But scopes + /// are always promoted to distributed with HanaConnection, which causes them to complete on concurrent + /// threads. This creates race conditions with following a scope disposal. As this null enlistment feature + /// is here for attemptinng de-enlisting a connection from a completed transaction not yet cleaned-up, and as + /// HanaConnection does not handle such a case, better disable it. + /// public override bool SupportsNullEnlistment => false; public override bool RequiresTimeSpanForTime => true; - public override bool HasDelayedDistributedTransactionCompletion => false; - - /// - public override bool SupportsEnlistmentWhenAutoEnlistmentIsDisabled => false; - System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(HanaBatchingBatcherFactory); } } From 341e217ea6f36a16c3e15670c33e5183b7bdfc63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Thu, 26 Apr 2018 12:03:16 +0200 Subject: [PATCH 06/12] Adjust some more code according to review Do some more reformatting, fix some more tab/spaces mixup. --- .../Ado/GenericBatchingBatcherFixture.cs | 2 +- .../Ado/GenericBatchingBatcherFixture.cs | 2 +- .../Seqidentity/SequenceIdentityFixture.cs | 2 +- src/NHibernate.Test/Async/Hql/HQLFunctions.cs | 2 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 10 +-- .../LoadingNullEntityInSet/Fixture.cs | 6 +- .../Async/NHSpecificTest/NH1601/Fixture1.cs | 40 +++++------ .../Async/NHSpecificTest/NH1601/Fixture2.cs | 40 +++++------ .../Async/NHSpecificTest/NH623/Fixture.cs | 2 +- .../FunctionTests/SubstringSupportFixture.cs | 2 +- .../Seqidentity/SequenceIdentityFixture.cs | 2 +- src/NHibernate.Test/Hql/HQLFunctions.cs | 2 +- .../NHSpecificTest/ListsWithHoles/Fixture.cs | 10 +-- .../LoadingNullEntityInSet/Fixture.cs | 6 +- .../NHSpecificTest/NH1601/Fixture1.cs | 18 ++--- .../NHSpecificTest/NH1601/Fixture2.cs | 18 ++--- .../NHSpecificTest/NH623/Fixture.cs | 2 +- .../HanaColumnStoreTestDialect.cs | 10 +-- .../TestDialects/HanaRowStoreTestDialect.cs | 10 +-- ...aTestDialect.cs => HanaTestDialectBase.cs} | 10 +-- src/NHibernate/AdoNet/HanaBatchingBatcher.cs | 11 +-- .../Async/AdoNet/HanaBatchingBatcher.cs | 70 +++++++++++-------- .../Dialect/HanaColumnStoreDialect.cs | 27 +------ ...tractHanaDialect.cs => HanaDialectBase.cs} | 8 +-- src/NHibernate/Dialect/HanaRowStoreDialect.cs | 27 +------ src/NHibernate/Dialect/Schema/HanaMetaData.cs | 32 ++++----- 26 files changed, 168 insertions(+), 203 deletions(-) rename src/NHibernate.Test/TestDialects/{AbstractHanaTestDialect.cs => HanaTestDialectBase.cs} (50%) rename src/NHibernate/Dialect/{AbstractHanaDialect.cs => HanaDialectBase.cs} (99%) diff --git a/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs b/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs index 9888fe700a2..de94a8f86a8 100644 --- a/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs +++ b/src/NHibernate.Test/Ado/GenericBatchingBatcherFixture.cs @@ -29,7 +29,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) return !(dialect is FirebirdDialect) && !(dialect is Oracle8iDialect) && !(dialect is MsSqlCeDialect) && - !(dialect is AbstractHanaDialect); + !(dialect is HanaDialectBase); } [Test] diff --git a/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs b/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs index 995fbaaf3af..f2889d53c44 100644 --- a/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs +++ b/src/NHibernate.Test/Async/Ado/GenericBatchingBatcherFixture.cs @@ -42,7 +42,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) return !(dialect is FirebirdDialect) && !(dialect is Oracle8iDialect) && !(dialect is MsSqlCeDialect) && - !(dialect is AbstractHanaDialect); + !(dialect is HanaDialectBase); } [Test] diff --git a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index 9c6e83b3963..e84b530e523 100644 --- a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -29,7 +29,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.AbstractHanaDialect); + return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.HanaDialectBase); } [Test] diff --git a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs index 0cb7675ce82..5addeedd44d 100644 --- a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs @@ -947,7 +947,7 @@ public async Task CastAsync() throw; } } - else if (Dialect is AbstractHanaDialect) + else if (Dialect is HanaDialectBase) { string msgToCheck = "not a GROUP BY expression: 'ANIMAL0_.BODYWEIGHT' must be in group by clause"; diff --git a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs index ac92e45e482..160622f9b90 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -18,12 +18,12 @@ namespace NHibernate.Test.NHSpecificTest.ListsWithHoles [TestFixture] public class FixtureAsync : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } - protected override IList Mappings + protected override IList Mappings { get { return new string[] { "NHSpecificTest.ListsWithHoles.Mappings.hbm.xml" }; } } diff --git a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index 1c93aebbe0e..58e5c02b4b0 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -32,9 +32,9 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override DebugSessionFactory BuildSessionFactory() diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs index e2c5e78bd47..d249389ec0a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture1.cs @@ -17,27 +17,27 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture1Async : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - - /// - /// Loads the project do not call Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } + + /// + /// Loads the project do not call Count on the list assigned. + /// + [Test] public Task TestSaveAndLoadWithoutCountAsync() - { - try - { - ProjectWithOneList.TestAccessToList = false; - return SaveAndLoadProjectWithOneListAsync(); - } - catch (System.Exception ex) - { - return Task.FromException(ex); - } - } + { + try + { + ProjectWithOneList.TestAccessToList = false; + return SaveAndLoadProjectWithOneListAsync(); + } + catch (System.Exception ex) + { + return Task.FromException(ex); + } + } /// /// Refreshes the project do not call Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs index 7137148460b..d5c4d00461b 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1601/Fixture2.cs @@ -17,27 +17,27 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture2Async : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - - /// - /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } + + /// + /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. + /// + [Test] public Task TestSaveAndLoadWithTwoCountsAsync() - { - try - { - Project.TestAccessToList = false; - return SaveAndLoadProjectAsync(); - } - catch (System.Exception ex) - { - return Task.FromException(ex); - } - } + { + try + { + Project.TestAccessToList = false; + return SaveAndLoadProjectAsync(); + } + catch (System.Exception ex) + { + return Task.FromException(ex); + } + } /// /// Refreshes the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs index 6f0c2cb13f2..b570712dbdd 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH623/Fixture.cs @@ -26,7 +26,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean + return !(dialect is HanaDialectBase); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean } private ISession session; diff --git a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs index a524d160a7e..8644493b502 100644 --- a/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs +++ b/src/NHibernate.Test/DialectTest/FunctionTests/SubstringSupportFixture.cs @@ -49,7 +49,7 @@ public void DialectShouldUseCorrectSubstringImplementation(System.Type dialectTy break; case Oracle8iDialect _: case SQLiteDialect _: - case AbstractHanaDialect _: + case HanaDialectBase _: Assert.That(substringFunction, Is.TypeOf()); break; default: diff --git a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index 878681d0ee0..23c0e4128fe 100644 --- a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -18,7 +18,7 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.AbstractHanaDialect); + return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.HanaDialectBase); } [Test] diff --git a/src/NHibernate.Test/Hql/HQLFunctions.cs b/src/NHibernate.Test/Hql/HQLFunctions.cs index 2c8edcb0d7c..778dde485d9 100644 --- a/src/NHibernate.Test/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Hql/HQLFunctions.cs @@ -936,7 +936,7 @@ public void Cast() throw; } } - else if (Dialect is AbstractHanaDialect) + else if (Dialect is HanaDialectBase) { string msgToCheck = "not a GROUP BY expression: 'ANIMAL0_.BODYWEIGHT' must be in group by clause"; diff --git a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs index d6709f8dadd..1ca671df404 100644 --- a/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/ListsWithHoles/Fixture.cs @@ -7,12 +7,12 @@ namespace NHibernate.Test.NHSpecificTest.ListsWithHoles [TestFixture] public class Fixture : TestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } - protected override IList Mappings + protected override IList Mappings { get { return new string[] { "NHSpecificTest.ListsWithHoles.Mappings.hbm.xml" }; } } diff --git a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs index 3d8d99a27db..3acdfcb0b76 100644 --- a/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/LoadingNullEntityInSet/Fixture.cs @@ -21,9 +21,9 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; } protected override DebugSessionFactory BuildSessionFactory() diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs index 7da77c773ad..c7077c576d7 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture1.cs @@ -5,15 +5,15 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture1 : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - - /// - /// Loads the project do not call Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } + + /// + /// Loads the project do not call Count on the list assigned. + /// + [Test] public void TestSaveAndLoadWithoutCount() { ProjectWithOneList.TestAccessToList = false; diff --git a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs index be4f111ad69..dd860d3d778 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1601/Fixture2.cs @@ -5,15 +5,15 @@ namespace NHibernate.Test.NHSpecificTest.NH1601 [TestFixture] public class Fixture2 : BugTestCase { - protected override bool AppliesTo(Dialect.Dialect dialect) - { - return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; - } - - /// - /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. - /// - [Test] + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsEmptyInsertsOrHasNonIdentityNativeGenerator; + } + + /// + /// Loads the project and when Scenario2 and Scenario3 are set calls Count on the list assigned. + /// + [Test] public void TestSaveAndLoadWithTwoCounts() { Project.TestAccessToList = false; diff --git a/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs index 603e19c36ba..371adb5cf2f 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH623/Fixture.cs @@ -15,7 +15,7 @@ public override string BugNumber protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is AbstractHanaDialect); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean + return !(dialect is HanaDialectBase); // The WHERE clause "isactive = '1'" doesn't work on HANA because idactive is a boolean } private ISession session; diff --git a/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs index 8a2d3b4f8ba..6ff9d0269ac 100644 --- a/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs +++ b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs @@ -1,10 +1,10 @@ namespace NHibernate.Test.TestDialects { - public class HanaColumnStoreTestDialect : AbstractHanaTestDialect + public class HanaColumnStoreTestDialect : HanaTestDialectBase { - public HanaColumnStoreTestDialect(Dialect.Dialect dialect) - : base(dialect) - { - } + public HanaColumnStoreTestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } } } diff --git a/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs index 1fec5201678..92b0e49cf07 100644 --- a/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs +++ b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs @@ -1,10 +1,10 @@ namespace NHibernate.Test.TestDialects { - public class HanaRowStoreTestDialect : AbstractHanaTestDialect + public class HanaRowStoreTestDialect : HanaTestDialectBase { - public HanaRowStoreTestDialect(Dialect.Dialect dialect) - : base(dialect) - { - } + public HanaRowStoreTestDialect(Dialect.Dialect dialect) + : base(dialect) + { + } } } diff --git a/src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs similarity index 50% rename from src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs rename to src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs index 1da24174114..501b8c7c649 100644 --- a/src/NHibernate.Test/TestDialects/AbstractHanaTestDialect.cs +++ b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs @@ -1,11 +1,11 @@ namespace NHibernate.Test.TestDialects { - public abstract class AbstractHanaTestDialect : TestDialect + public abstract class HanaTestDialectBase : TestDialect { - public AbstractHanaTestDialect(Dialect.Dialect dialect) - : base(dialect) - { - } + protected HanaTestDialectBase(Dialect.Dialect dialect) + : base(dialect) + { + } public override bool SupportsComplexExpressionInGroupBy => false; diff --git a/src/NHibernate/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs index 24dfd4f4dd2..b92af57e7da 100644 --- a/src/NHibernate/AdoNet/HanaBatchingBatcher.cs +++ b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Data.Common; -using System.Diagnostics; using System.Text; using NHibernate.AdoNet.Util; using NHibernate.Exceptions; @@ -9,7 +8,7 @@ namespace NHibernate.AdoNet { /// - /// Summary description for HanaBatchingBatcher. + /// DML batcher for HANA. /// By Jonathan Bregler /// public partial class HanaBatchingBatcher : AbstractBatcher @@ -34,7 +33,9 @@ public HanaBatchingBatcher(ConnectionManager connectionManager, IInterceptor int public override void AddToBatch(IExpectation expectation) { - Debug.Assert(CurrentCommand is ICloneable); // HanaCommands are cloneable + // HanaCommands are cloneable + if (!(CurrentCommand is ICloneable cloneableCurrentCommand)) + throw new InvalidOperationException("Current command is not an ICloneable"); var batchUpdate = CurrentCommand; Prepare(batchUpdate); @@ -61,10 +62,10 @@ public override void AddToBatch(IExpectation expectation) if (_currentBatch == null) { // use first command as the batching command - _currentBatch = (batchUpdate as ICloneable).Clone() as DbCommand; + _currentBatch = cloneableCurrentCommand.Clone() as DbCommand; } - _currentBatchCommands.Add((batchUpdate as ICloneable).Clone() as DbCommand); + _currentBatchCommands.Add(cloneableCurrentCommand.Clone() as DbCommand); _countOfCommands++; diff --git a/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs index 957e29f070b..5b17f554399 100644 --- a/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs +++ b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; using System.Data.Common; -using System.Diagnostics; using System.Text; using NHibernate.AdoNet.Util; using NHibernate.Exceptions; @@ -23,46 +22,55 @@ namespace NHibernate.AdoNet public partial class HanaBatchingBatcher : AbstractBatcher { - public override async Task AddToBatchAsync(IExpectation expectation, CancellationToken cancellationToken) + public override Task AddToBatchAsync(IExpectation expectation, CancellationToken cancellationToken) { - cancellationToken.ThrowIfCancellationRequested(); - Debug.Assert(CurrentCommand is ICloneable); // HanaCommands are cloneable + // HanaCommands are cloneable + if (!(CurrentCommand is ICloneable cloneableCurrentCommand)) + throw new InvalidOperationException("Current command is not an ICloneable"); + if (cancellationToken.IsCancellationRequested) + { + return Task.FromCanceled(cancellationToken); + } + return InternalAddToBatchAsync(); + async Task InternalAddToBatchAsync() + { - var batchUpdate = CurrentCommand; - await (PrepareAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); - Driver.AdjustCommand(batchUpdate); + var batchUpdate = CurrentCommand; + await (PrepareAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); + Driver.AdjustCommand(batchUpdate); - _totalExpectedRowsAffected += expectation.ExpectedRowCount; - string lineWithParameters = null; - var sqlStatementLogger = Factory.Settings.SqlStatementLogger; - if (sqlStatementLogger.IsDebugEnabled || Log.IsDebugEnabled()) - { - lineWithParameters = sqlStatementLogger.GetCommandLineWithParameters(batchUpdate); - var formatStyle = sqlStatementLogger.DetermineActualStyle(FormatStyle.Basic); - lineWithParameters = formatStyle.Formatter.Format(lineWithParameters); - _currentBatchCommandsLog.Append("command ") + _totalExpectedRowsAffected += expectation.ExpectedRowCount; + string lineWithParameters = null; + var sqlStatementLogger = Factory.Settings.SqlStatementLogger; + if (sqlStatementLogger.IsDebugEnabled || Log.IsDebugEnabled()) + { + lineWithParameters = sqlStatementLogger.GetCommandLineWithParameters(batchUpdate); + var formatStyle = sqlStatementLogger.DetermineActualStyle(FormatStyle.Basic); + lineWithParameters = formatStyle.Formatter.Format(lineWithParameters); + _currentBatchCommandsLog.Append("command ") .Append(_countOfCommands) .Append(":") .AppendLine(lineWithParameters); - } - if (Log.IsDebugEnabled()) - { - Log.Debug("Adding to batch:{0}", lineWithParameters); - } + } + if (Log.IsDebugEnabled()) + { + Log.Debug("Adding to batch:{0}", lineWithParameters); + } - if (_currentBatch == null) - { - // use first command as the batching command - _currentBatch = (batchUpdate as ICloneable).Clone() as DbCommand; - } + if (_currentBatch == null) + { + // use first command as the batching command + _currentBatch = cloneableCurrentCommand.Clone() as DbCommand; + } - _currentBatchCommands.Add((batchUpdate as ICloneable).Clone() as DbCommand); + _currentBatchCommands.Add(cloneableCurrentCommand.Clone() as DbCommand); - _countOfCommands++; + _countOfCommands++; - if (_countOfCommands >= _batchSize) - { - await (DoExecuteBatchAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); + if (_countOfCommands >= _batchSize) + { + await (DoExecuteBatchAsync(batchUpdate, cancellationToken)).ConfigureAwait(false); + } } } diff --git a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs index f77b850e62c..3da6fcff35a 100644 --- a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs @@ -1,14 +1,3 @@ -using System; -using System.Data; -using System.Data.Common; -using System.Text; -using NHibernate.Dialect.Function; -using NHibernate.Dialect.Schema; -using NHibernate.SqlCommand; -using NHibernate.SqlTypes; -using NHibernate.Util; -using Environment = NHibernate.Cfg.Environment; - namespace NHibernate.Dialect { /// @@ -27,22 +16,12 @@ namespace NHibernate.Dialect /// /// /// - public class HanaColumnStoreDialect : AbstractHanaDialect + public class HanaColumnStoreDialect : HanaDialectBase { - public HanaColumnStoreDialect() - { - } - /// - public override string CreateTableString - { - get { return "create column table"; } - } + public override string CreateTableString => "create column table"; /// - public override string CreateTemporaryTableString - { - get { return "create local temporary column table"; } - } + public override string CreateTemporaryTableString => "create local temporary column table"; } } diff --git a/src/NHibernate/Dialect/AbstractHanaDialect.cs b/src/NHibernate/Dialect/HanaDialectBase.cs similarity index 99% rename from src/NHibernate/Dialect/AbstractHanaDialect.cs rename to src/NHibernate/Dialect/HanaDialectBase.cs index 8f33c787b79..ef0dc2922a1 100644 --- a/src/NHibernate/Dialect/AbstractHanaDialect.cs +++ b/src/NHibernate/Dialect/HanaDialectBase.cs @@ -2,14 +2,12 @@ using System.Collections; using System.Data; using System.Data.Common; -using System.Text; using NHibernate.Dialect.Function; using NHibernate.Dialect.Schema; using NHibernate.Engine; using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Type; -using NHibernate.Util; using Environment = NHibernate.Cfg.Environment; namespace NHibernate.Dialect @@ -18,7 +16,7 @@ namespace NHibernate.Dialect /// A SQL dialect base class for SAP HANA /// /// - /// The AbstractHanaDialect defaults the following configuration properties: + /// The HanaDialectBase defaults the following configuration properties: /// /// /// Property @@ -30,7 +28,7 @@ namespace NHibernate.Dialect /// /// /// - public abstract class AbstractHanaDialect : Dialect + public abstract class HanaDialectBase : Dialect { [Serializable] private class TypeConvertingVarArgsSQLFunction : ISQLFunction @@ -85,7 +83,7 @@ public SqlString Render(IList args, ISessionFactoryImplementor factory) #endregion } - public AbstractHanaDialect() + protected HanaDialectBase() { //string type RegisterColumnType(DbType.AnsiStringFixedLength, "VARCHAR(255)"); diff --git a/src/NHibernate/Dialect/HanaRowStoreDialect.cs b/src/NHibernate/Dialect/HanaRowStoreDialect.cs index af620c028fb..87ce928e12b 100644 --- a/src/NHibernate/Dialect/HanaRowStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaRowStoreDialect.cs @@ -1,14 +1,3 @@ -using System; -using System.Data; -using System.Data.Common; -using System.Text; -using NHibernate.Dialect.Function; -using NHibernate.Dialect.Schema; -using NHibernate.SqlCommand; -using NHibernate.SqlTypes; -using NHibernate.Util; -using Environment = NHibernate.Cfg.Environment; - namespace NHibernate.Dialect { /// @@ -27,22 +16,12 @@ namespace NHibernate.Dialect /// /// /// - public class HanaRowStoreDialect : AbstractHanaDialect + public class HanaRowStoreDialect : HanaDialectBase { - public HanaRowStoreDialect() - { - } - /// - public override string CreateTableString - { - get { return "create row table"; } - } + public override string CreateTableString => "create row table"; /// - public override string CreateTemporaryTableString - { - get { return "create local temporary row table"; } - } + public override string CreateTemporaryTableString => "create local temporary row table"; } } diff --git a/src/NHibernate/Dialect/Schema/HanaMetaData.cs b/src/NHibernate/Dialect/Schema/HanaMetaData.cs index 6c295d5630e..c1125d5bb32 100644 --- a/src/NHibernate/Dialect/Schema/HanaMetaData.cs +++ b/src/NHibernate/Dialect/Schema/HanaMetaData.cs @@ -36,47 +36,47 @@ public override ISet GetReservedWords() return result; } - + public override DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types) { - var restrictions = new[] {schemaPattern, tableNamePattern, null}; + var restrictions = new[] { schemaPattern, tableNamePattern, null }; DataTable objTbl = Connection.GetSchema("Tables", restrictions); return objTbl; } public override DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) { - var restrictions = new[] {schemaPattern, tableName, null}; + var restrictions = new[] { schemaPattern, tableName, null }; DataTable objTbl = Connection.GetSchema("Indexes", restrictions); return objTbl; } public override DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) { - var restrictions = new[] {schemaPattern, tableName, indexName, null}; + var restrictions = new[] { schemaPattern, tableName, indexName, null }; DataTable objTbl = Connection.GetSchema("IndexColumns", restrictions); return objTbl; } - public override DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, - string columnNamePattern) + public override DataTable GetColumns( + string catalog, + string schemaPattern, + string tableNamePattern, + string columnNamePattern) { - var restrictions = new[] {schemaPattern, tableNamePattern, null}; + var restrictions = new[] { schemaPattern, tableNamePattern, null }; DataTable objTbl = Connection.GetSchema("Columns", restrictions); return objTbl; } public override DataTable GetForeignKeys(string catalog, string schema, string table) { - var restrictions = new[] {schema, table, null}; + var restrictions = new[] { schema, table, null }; DataTable objTbl = Connection.GetSchema("ForeignKeys", restrictions); return objTbl; } - public override bool StoresUpperCaseIdentifiers - { - get { return true; } - } + public override bool StoresUpperCaseIdentifiers => true; } public class HanaTableMetadata : AbstractTableMetadata @@ -95,7 +95,7 @@ protected override void ParseTableInfo(DataRow rs) protected override string GetConstraintName(DataRow rs) { - return Convert.ToString(rs["CONSTRAINT_NAME"]); + return Convert.ToString(rs["CONSTRAINT_NAME"]); } protected override string GetColumnName(DataRow rs) @@ -130,9 +130,9 @@ public HanaColumnMetadata(DataRow rs) : base(rs) { Name = Convert.ToString(rs["COLUMN_NAME"]); - - this.SetColumnSize(rs["CHARACTER_MAXIMUM_LENGTH"]); - this.SetNumericalPrecision(rs["NUMERIC_PRECISION"]); + + SetColumnSize(rs["CHARACTER_MAXIMUM_LENGTH"]); + SetNumericalPrecision(rs["NUMERIC_PRECISION"]); Nullable = Convert.ToString(rs["IS_NULLABLE"]); TypeName = Convert.ToString(rs["DATA_TYPE"]); From 9566ee45e8e771dd882be24887286ef01cc4a355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Thu, 26 Apr 2018 13:02:09 +0200 Subject: [PATCH 07/12] Retake/redo some changes reverted in excess --- .../Async/Legacy/MultiTableTest.cs | 16 ++++++++-------- src/NHibernate.Test/Legacy/MultiTableTest.cs | 16 ++++++++-------- src/NHibernate.Test/TestDialect.cs | 8 +++++++- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs index 9de4245ea43..6eed8f4564f 100644 --- a/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Async/Legacy/MultiTableTest.cs @@ -148,7 +148,7 @@ public async Task QueriesAsync() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = (long) await (s.SaveAsync(new TrivialClass())); } @@ -184,7 +184,7 @@ public async Task ConstraintsAsync() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { await (s.SaveAsync(sm)); } @@ -215,7 +215,7 @@ public async Task MultiTableAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -230,7 +230,7 @@ public async Task MultiTableAsync() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { smid = await (s.SaveAsync(sm)); } @@ -464,7 +464,7 @@ public async Task MultiTableCollectionsAsync() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = await (s.SaveAsync(multi)); sid = await (s.SaveAsync(simp)); @@ -484,7 +484,7 @@ public async Task MultiTableCollectionsAsync() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = await (s.SaveAsync(ls)); } @@ -541,7 +541,7 @@ public async Task MultiTableManyToOneAsync() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = await (s.SaveAsync(multi)); } @@ -556,7 +556,7 @@ public async Task MultiTableManyToOneAsync() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = await (s.SaveAsync(ls)); } diff --git a/src/NHibernate.Test/Legacy/MultiTableTest.cs b/src/NHibernate.Test/Legacy/MultiTableTest.cs index dadb6f2c120..30ecf60edb7 100644 --- a/src/NHibernate.Test/Legacy/MultiTableTest.cs +++ b/src/NHibernate.Test/Legacy/MultiTableTest.cs @@ -149,7 +149,7 @@ public void Queries() ISession s = OpenSession(); long id = 1L; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = (long) s.Save(new TrivialClass()); } @@ -185,7 +185,7 @@ public void Constraints() ITransaction t = s.BeginTransaction(); SubMulti sm = new SubMulti(); sm.Amount = 66.5f; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { s.Save(sm); } @@ -216,7 +216,7 @@ public void MultiTable() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = s.Save(multi); sid = s.Save(simp); @@ -231,7 +231,7 @@ public void MultiTable() SubMulti sm = new SubMulti(); sm.Amount = 66.5f; object smid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { smid = s.Save(sm); } @@ -465,7 +465,7 @@ public void MultiTableCollections() simp.Name = "simp"; object mid; object sid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = s.Save(multi); sid = s.Save(simp); @@ -485,7 +485,7 @@ public void MultiTableCollections() ls.Set = new HashSet { multi, simp }; object id; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = s.Save(ls); } @@ -542,7 +542,7 @@ public void MultiTableManyToOne() simp.Name = "simp"; object mid; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { mid = s.Save(multi); } @@ -557,7 +557,7 @@ public void MultiTableManyToOne() ls.YetAnother = ls; ls.Name = "Less Simple"; object id; - if (Dialect is MsSql2000Dialect) + if (TestDialect.HasIdentityNativeGenerator) { id = s.Save(ls); } diff --git a/src/NHibernate.Test/TestDialect.cs b/src/NHibernate.Test/TestDialect.cs index 050d065c21b..084f2a89359 100644 --- a/src/NHibernate.Test/TestDialect.cs +++ b/src/NHibernate.Test/TestDialect.cs @@ -27,6 +27,12 @@ public TestDialect(Dialect.Dialect dialect) _dialect = dialect; } + /// + /// Has a native generator strategy resolving to identity. + /// + public bool HasIdentityNativeGenerator + => _dialect.NativeIdentifierGeneratorClass == typeof(IdentityGenerator); + public virtual bool SupportsOperatorAll => true; public virtual bool SupportsOperatorSome => true; public virtual bool SupportsLocate => true; @@ -66,7 +72,7 @@ public TestDialect(Dialect.Dialect dialect) /// This property is useful for cases where empty inserts happens only when the entities /// generator is native while the dialect uses identity for this generator. public bool SupportsEmptyInsertsOrHasNonIdentityNativeGenerator - => SupportsEmptyInserts || _dialect.NativeIdentifierGeneratorClass != typeof(IdentityGenerator); + => SupportsEmptyInserts || !HasIdentityNativeGenerator; /// From 90055a428d14f7d310de8920bde0f08b0b04e8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Thu, 26 Apr 2018 13:16:09 +0200 Subject: [PATCH 08/12] Add a comment for the batcher implementation --- src/NHibernate/AdoNet/HanaBatchingBatcher.cs | 2 ++ src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/NHibernate/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs index b92af57e7da..545dc504865 100644 --- a/src/NHibernate/AdoNet/HanaBatchingBatcher.cs +++ b/src/NHibernate/AdoNet/HanaBatchingBatcher.cs @@ -96,6 +96,8 @@ protected override void DoExecuteBatch(DbCommand ps) foreach (var command in _currentBatchCommands) { + // Batching with HANA works by simply defining multiple times each command parameter. + // (Undocumented feature explained by a developer of the provider.) foreach (DbParameter parameter in command.Parameters) { _currentBatch.Parameters.Add(parameter); diff --git a/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs index 5b17f554399..af028fedf37 100644 --- a/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs +++ b/src/NHibernate/Async/AdoNet/HanaBatchingBatcher.cs @@ -96,6 +96,8 @@ protected override async Task DoExecuteBatchAsync(DbCommand ps, CancellationToke foreach (var command in _currentBatchCommands) { + // Batching with HANA works by simply defining multiple times each command parameter. + // (Undocumented feature explained by a developer of the provider.) foreach (DbParameter parameter in command.Parameters) { _currentBatch.Parameters.Add(parameter); From ab23ff1673415758cc62b9742b1ded455d5ad1fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Thu, 26 Apr 2018 15:59:46 +0200 Subject: [PATCH 09/12] Handle scalar sub-select failure cases --- .../Async/Linq/ByMethod/OrderByTests.cs | 20 +++++++++++------- .../Async/Linq/WhereSubqueryTests.cs | 21 +++++++++++++++++++ .../Async/NHSpecificTest/NH1394/Fixture.cs | 10 ++++----- .../Async/NHSpecificTest/NH2760/Fixture.cs | 8 ++++++- .../NHSpecificTest/NH3414/FixtureByCode.cs | 2 +- .../Linq/ByMethod/OrderByTests.cs | 20 +++++++++++------- .../Linq/WhereSubqueryTests.cs | 21 +++++++++++++++++++ .../NHSpecificTest/NH1394/Fixture.cs | 10 ++++----- .../NHSpecificTest/NH2760/Fixture.cs | 8 ++++++- .../NHSpecificTest/NH3414/FixtureByCode.cs | 2 +- src/NHibernate.Test/TestDialect.cs | 10 +++++++++ .../TestDialects/HanaTestDialectBase.cs | 13 ++++++++++++ 12 files changed, 117 insertions(+), 28 deletions(-) diff --git a/src/NHibernate.Test/Async/Linq/ByMethod/OrderByTests.cs b/src/NHibernate.Test/Async/Linq/ByMethod/OrderByTests.cs index 207f713d47f..9a959e1865b 100644 --- a/src/NHibernate.Test/Async/Linq/ByMethod/OrderByTests.cs +++ b/src/NHibernate.Test/Async/Linq/ByMethod/OrderByTests.cs @@ -72,8 +72,8 @@ orderby c.CustomerId descending [Test] public async Task OrderByCalculatedAggregatedSubselectPropertyAsync() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); //NH-2781 var result = await (db.Orders @@ -93,8 +93,8 @@ public async Task OrderByCalculatedAggregatedSubselectPropertyAsync() [Test] public async Task AggregateAscendingOrderByClauseAsync() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); var query = from c in db.Customers orderby c.Orders.Count @@ -109,8 +109,8 @@ orderby c.Orders.Count [Test] public async Task AggregateDescendingOrderByClauseAsync() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); var query = from c in db.Customers orderby c.Orders.Count descending @@ -191,6 +191,9 @@ public async Task OrderByWithSelfReferencedSubquery1Async() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + if (Dialect is Oracle8iDialect) Assert.Ignore("On Oracle this generates a correlated subquery two levels deep which isn't supported until Oracle 10g."); @@ -209,6 +212,9 @@ public async Task OrderByWithSelfReferencedSubquery2Async() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + if (Dialect is Oracle8iDialect) Assert.Ignore("On Oracle this generates a correlated subquery two levels deep which isn't supported until Oracle 10g."); @@ -251,4 +257,4 @@ public Task OrderByWithSelectDistinctAndTakeAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs index 6c980702a96..7ec1685319a 100644 --- a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs @@ -613,6 +613,9 @@ public async Task SubqueryWhereFailingTestAsync() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = await ((db.OrderLines .Select(ol => new { @@ -632,6 +635,9 @@ public async Task SubqueryWhereFailingTest2Async() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = await (db.OrderLines .Select(ol => new { @@ -651,6 +657,9 @@ public async Task SubqueryWhereFailingTest3Async() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = await (db.OrderLines .Select(ol => new { @@ -670,6 +679,9 @@ public async Task ProductsWithSubqueryReturningBoolFirstOrDefaultEqAsync() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = await ((from p in db.Products where (from c in db.Categories where c.Name == "Confections" @@ -687,6 +699,9 @@ public async Task SubselectCanHaveBoolResultAsync() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = await ((from c in db.Categories where c.Products.OrderBy(p => p.ProductId).Select(p => p.Discontinued).FirstOrDefault() == false select c).ToListAsync()); @@ -701,6 +716,9 @@ public async Task ProductsWithSubqueryReturningProjectionBoolFirstOrDefaultEqAsy if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + //NH-3190 var result = await ((from p in db.Products where (from c in db.Categories @@ -719,6 +737,9 @@ public async Task ProductsWithSubqueryReturningStringFirstOrDefaultEqAsync() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = await ((from p in db.Products where (from c in db.Categories where c.Name == "Confections" diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1394/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1394/Fixture.cs index 6429fd501f0..641113b1e29 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1394/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1394/Fixture.cs @@ -85,8 +85,8 @@ public async Task CanOrderByPropertyProjectionAsync() [Test] public async Task CanOrderBySubqueryProjectionAsync() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); using (ISession s = OpenSession()) { @@ -115,8 +115,8 @@ public async Task CanOrderBySubqueryProjectionAsync() [Test] public async Task CanOrderBySubqueryProjectionDescAsync() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); using (ISession s = OpenSession()) { @@ -177,4 +177,4 @@ public async Task CanOrderBySqlProjectionDescAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2760/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2760/Fixture.cs index c56740a391d..8c5a23a67ec 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2760/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2760/Fixture.cs @@ -68,6 +68,9 @@ protected override void OnTearDown() [Test] public async Task ShouldBeAbleToSelectUserGroupAndOrderByUserCountAsync() { + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); + using (ISession session = base.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { @@ -136,6 +139,9 @@ from ug in session.Query() [Test] public async Task ShouldBeAbleToSelectUserGroupAndOrderByUserCountWithHqlAsync() { + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); + using (ISession session = base.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { @@ -151,4 +157,4 @@ public async Task ShouldBeAbleToSelectUserGroupAndOrderByUserCountWithHqlAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3414/FixtureByCode.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3414/FixtureByCode.cs index e507d77fd62..51eae05506e 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3414/FixtureByCode.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3414/FixtureByCode.cs @@ -23,7 +23,7 @@ public class ByCodeFixtureAsync : TestCaseMappingByCode protected override bool AppliesTo(Dialect.Dialect dialect) { // Test ordering by a scalar sub-select. - return Dialect.SupportsScalarSubSelects; + return TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy; } protected override HbmMapping GetMappings() diff --git a/src/NHibernate.Test/Linq/ByMethod/OrderByTests.cs b/src/NHibernate.Test/Linq/ByMethod/OrderByTests.cs index 7f19c1bdc73..0a4f0ade222 100644 --- a/src/NHibernate.Test/Linq/ByMethod/OrderByTests.cs +++ b/src/NHibernate.Test/Linq/ByMethod/OrderByTests.cs @@ -60,8 +60,8 @@ orderby c.CustomerId descending [Test] public void OrderByCalculatedAggregatedSubselectProperty() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); //NH-2781 var result = db.Orders @@ -81,8 +81,8 @@ public void OrderByCalculatedAggregatedSubselectProperty() [Test] public void AggregateAscendingOrderByClause() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); var query = from c in db.Customers orderby c.Orders.Count @@ -97,8 +97,8 @@ orderby c.Orders.Count [Test] public void AggregateDescendingOrderByClause() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); var query = from c in db.Customers orderby c.Orders.Count descending @@ -179,6 +179,9 @@ public void OrderByWithSelfReferencedSubquery1() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + if (Dialect is Oracle8iDialect) Assert.Ignore("On Oracle this generates a correlated subquery two levels deep which isn't supported until Oracle 10g."); @@ -197,6 +200,9 @@ public void OrderByWithSelfReferencedSubquery2() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore("Dialect does not support scalar sub-selects"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + if (Dialect is Oracle8iDialect) Assert.Ignore("On Oracle this generates a correlated subquery two levels deep which isn't supported until Oracle 10g."); @@ -225,4 +231,4 @@ public void OrderByWithSelectDistinctAndTake() db.Orders.Select(o => o.ShippedTo).Distinct().OrderBy(o => o).Take(1000).ToList(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs index 15fcec0ef36..060d6bc1710 100644 --- a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs @@ -601,6 +601,9 @@ public void SubqueryWhereFailingTest() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = (db.OrderLines .Select(ol => new { @@ -620,6 +623,9 @@ public void SubqueryWhereFailingTest2() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = db.OrderLines .Select(ol => new { @@ -639,6 +645,9 @@ public void SubqueryWhereFailingTest3() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support subquery in select clause"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var list = db.OrderLines .Select(ol => new { @@ -658,6 +667,9 @@ public void ProductsWithSubqueryReturningBoolFirstOrDefaultEq() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = (from p in db.Products where (from c in db.Categories where c.Name == "Confections" @@ -675,6 +687,9 @@ public void SubselectCanHaveBoolResult() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = (from c in db.Categories where c.Products.OrderBy(p => p.ProductId).Select(p => p.Discontinued).FirstOrDefault() == false select c).ToList(); @@ -689,6 +704,9 @@ public void ProductsWithSubqueryReturningProjectionBoolFirstOrDefaultEq() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + //NH-3190 var result = (from p in db.Products where (from c in db.Categories @@ -707,6 +725,9 @@ public void ProductsWithSubqueryReturningStringFirstOrDefaultEq() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsOrderByAndLimitInSubQueries) + Assert.Ignore("Dialect does not support sub-selects with order by or limit/top"); + var result = (from p in db.Products where (from c in db.Categories where c.Name == "Confections" diff --git a/src/NHibernate.Test/NHSpecificTest/NH1394/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1394/Fixture.cs index 90b7ee820b2..0bad20e6fc7 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1394/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1394/Fixture.cs @@ -74,8 +74,8 @@ public void CanOrderByPropertyProjection() [Test] public void CanOrderBySubqueryProjection() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); using (ISession s = OpenSession()) { @@ -104,8 +104,8 @@ public void CanOrderBySubqueryProjection() [Test] public void CanOrderBySubqueryProjectionDesc() { - if (!Dialect.SupportsScalarSubSelects) - Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); using (ISession s = OpenSession()) { @@ -166,4 +166,4 @@ public void CanOrderBySqlProjectionDesc() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH2760/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2760/Fixture.cs index c11ad466463..30bf81f82c5 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2760/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2760/Fixture.cs @@ -57,6 +57,9 @@ protected override void OnTearDown() [Test] public void ShouldBeAbleToSelectUserGroupAndOrderByUserCount() { + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); + using (ISession session = base.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { @@ -125,6 +128,9 @@ from ug in session.Query() [Test] public void ShouldBeAbleToSelectUserGroupAndOrderByUserCountWithHql() { + if (!TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy) + Assert.Ignore("Dialect does not support aggregating scalar sub-selects in order by"); + using (ISession session = base.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { @@ -140,4 +146,4 @@ public void ShouldBeAbleToSelectUserGroupAndOrderByUserCountWithHql() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH3414/FixtureByCode.cs b/src/NHibernate.Test/NHSpecificTest/NH3414/FixtureByCode.cs index c58d1768136..8fc7299d3b6 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3414/FixtureByCode.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3414/FixtureByCode.cs @@ -12,7 +12,7 @@ public class ByCodeFixture : TestCaseMappingByCode protected override bool AppliesTo(Dialect.Dialect dialect) { // Test ordering by a scalar sub-select. - return Dialect.SupportsScalarSubSelects; + return TestDialect.SupportsAggregatingScalarSubSelectsInOrderBy; } protected override HbmMapping GetMappings() diff --git a/src/NHibernate.Test/TestDialect.cs b/src/NHibernate.Test/TestDialect.cs index 084f2a89359..01f3d77b444 100644 --- a/src/NHibernate.Test/TestDialect.cs +++ b/src/NHibernate.Test/TestDialect.cs @@ -97,5 +97,15 @@ public bool SupportsSqlType(SqlType sqlType) /// Supports the modulo operator on decimal types /// public virtual bool SupportsModuloOnDecimal => true; + + /// + /// Supports aggregating sub-selects in order by clause + /// + public virtual bool SupportsAggregatingScalarSubSelectsInOrderBy => _dialect.SupportsScalarSubSelects; + + /// + /// Supports order by and limits/top in correlated sub-queries + /// + public virtual bool SupportsOrderByAndLimitInSubQueries => true; } } diff --git a/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs index 501b8c7c649..1ba43127330 100644 --- a/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs +++ b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs @@ -10,5 +10,18 @@ protected HanaTestDialectBase(Dialect.Dialect dialect) public override bool SupportsComplexExpressionInGroupBy => false; public override bool SupportsEmptyInserts => false; + + /// + /// + /// Looks as a HANA 2 SP3 bug: HANA complains about the main select columns not being part of a group-by + /// or not being in an aggregation function, while only the sub-select in order by is grouped. + /// + public override bool SupportsAggregatingScalarSubSelectsInOrderBy => false; + + /// + /// + /// HANA 2 SP3 yields in such case: correlated subquery cannot have TOP or ORDER BY + /// + public override bool SupportsOrderByAndLimitInSubQueries => false; } } From 51d094b62ab1a5ac198dc97e8928d5dc48134b18 Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Thu, 26 Apr 2018 15:26:14 +0200 Subject: [PATCH 10/12] Address more PR review comments. --- .../Generatedkeys/Seqidentity/SequenceIdentityFixture.cs | 4 +++- src/NHibernate.Test/Async/Hql/HQLFunctions.cs | 2 +- src/NHibernate.Test/Async/Legacy/FooBarTest.cs | 2 +- src/NHibernate.Test/Async/Linq/PropertyMethodMappingTests.cs | 4 ++-- .../Generatedkeys/Seqidentity/SequenceIdentityFixture.cs | 4 +++- src/NHibernate.Test/Hql/HQLFunctions.cs | 2 +- src/NHibernate.Test/Legacy/FooBarTest.cs | 2 +- src/NHibernate.Test/Linq/PropertyMethodMappingTests.cs | 4 ++-- src/NHibernate.Test/Linq/SelectionTests.cs | 2 +- 9 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index e84b530e523..3a6e766c567 100644 --- a/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Async/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -29,7 +29,9 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.HanaDialectBase); + return dialect.SupportsSequences && + !(dialect is Dialect.MsSql2012Dialect) && + !(dialect is Dialect.HanaDialectBase); // SAP HANA does not support a syntax allowing to return the inserted id as an output parameter or a return value } [Test] diff --git a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs index 5addeedd44d..b1f3c6daea4 100644 --- a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs @@ -1151,7 +1151,7 @@ public async Task StrAsync() [Test] public async Task IifAsync() { - AssumeFunctionSupported("Iif"); + AssumeFunctionSupported("iif"); using (ISession s = OpenSession()) { await (s.SaveAsync(new MaterialResource("Flash card 512MB", "A001/07", MaterialResource.MaterialState.Available))); diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index d148a732bf6..826288d13a1 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -2490,7 +2490,7 @@ public async Task CollectionsInSelectAsync() // probably the conversion ProxyArray.id (to_number ensuring a not null value) // Indeed, ProxyArray.id is Glarch.tha_key which is a string filled with a Guid. It does // not fail with most engine likely because there are no results thanks to other conditions. - if (!(Dialect is Oracle8iDialect) && !(Dialect is MsSqlCeDialect)) + if (!(Dialect is Oracle8iDialect) && !(Dialect is MsSqlCeDialect) && !(Dialect is HanaDialectBase)) { await (s.CreateQuery( "select count(*) from Bar as bar join bar.Component.Glarch.ProxyArray as g where cast(g.id as Int32) in indices(bar.Baz.FooArray)"). diff --git a/src/NHibernate.Test/Async/Linq/PropertyMethodMappingTests.cs b/src/NHibernate.Test/Async/Linq/PropertyMethodMappingTests.cs index 9a5d5ec73ba..127593a0ec4 100644 --- a/src/NHibernate.Test/Async/Linq/PropertyMethodMappingTests.cs +++ b/src/NHibernate.Test/Async/Linq/PropertyMethodMappingTests.cs @@ -27,7 +27,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) public async Task CanExecuteCountInSelectClauseAsync() { var results = await (db.Timesheets - .Select(t => t.Entries.Count).ToListAsync()); + .Select(t => t.Entries.Count).OrderBy(s => s).ToListAsync()); Assert.AreEqual(3, results.Count); Assert.AreEqual(0, results[0]); @@ -44,4 +44,4 @@ public async Task CanExecuteCountInWhereClauseAsync() Assert.AreEqual(2, results.Count); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs index 23c0e4128fe..88584e51366 100644 --- a/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs +++ b/src/NHibernate.Test/Generatedkeys/Seqidentity/SequenceIdentityFixture.cs @@ -18,7 +18,9 @@ protected override string MappingsAssembly protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect.SupportsSequences && !(dialect is Dialect.MsSql2012Dialect) && !(dialect is Dialect.HanaDialectBase); + return dialect.SupportsSequences && + !(dialect is Dialect.MsSql2012Dialect) && + !(dialect is Dialect.HanaDialectBase); // SAP HANA does not support a syntax allowing to return the inserted id as an output parameter or a return value } [Test] diff --git a/src/NHibernate.Test/Hql/HQLFunctions.cs b/src/NHibernate.Test/Hql/HQLFunctions.cs index 778dde485d9..35a447cbbfd 100644 --- a/src/NHibernate.Test/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Hql/HQLFunctions.cs @@ -1140,7 +1140,7 @@ public void Str() [Test] public void Iif() { - AssumeFunctionSupported("Iif"); + AssumeFunctionSupported("iif"); using (ISession s = OpenSession()) { s.Save(new MaterialResource("Flash card 512MB", "A001/07", MaterialResource.MaterialState.Available)); diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index 0a05c46e884..e099aa30ffe 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -2478,7 +2478,7 @@ public void CollectionsInSelect() // probably the conversion ProxyArray.id (to_number ensuring a not null value) // Indeed, ProxyArray.id is Glarch.tha_key which is a string filled with a Guid. It does // not fail with most engine likely because there are no results thanks to other conditions. - if (!(Dialect is Oracle8iDialect) && !(Dialect is MsSqlCeDialect)) + if (!(Dialect is Oracle8iDialect) && !(Dialect is MsSqlCeDialect) && !(Dialect is HanaDialectBase)) { s.CreateQuery( "select count(*) from Bar as bar join bar.Component.Glarch.ProxyArray as g where cast(g.id as Int32) in indices(bar.Baz.FooArray)"). diff --git a/src/NHibernate.Test/Linq/PropertyMethodMappingTests.cs b/src/NHibernate.Test/Linq/PropertyMethodMappingTests.cs index b425f1ee0c8..5881e3abba4 100644 --- a/src/NHibernate.Test/Linq/PropertyMethodMappingTests.cs +++ b/src/NHibernate.Test/Linq/PropertyMethodMappingTests.cs @@ -15,7 +15,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) public void CanExecuteCountInSelectClause() { var results = db.Timesheets - .Select(t => t.Entries.Count).ToList(); + .Select(t => t.Entries.Count).OrderBy(s => s).ToList(); Assert.AreEqual(3, results.Count); Assert.AreEqual(0, results[0]); @@ -32,4 +32,4 @@ public void CanExecuteCountInWhereClause() Assert.AreEqual(2, results.Count); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Linq/SelectionTests.cs b/src/NHibernate.Test/Linq/SelectionTests.cs index a8cb1692af8..3873558badf 100644 --- a/src/NHibernate.Test/Linq/SelectionTests.cs +++ b/src/NHibernate.Test/Linq/SelectionTests.cs @@ -286,7 +286,7 @@ public void CanSelectWithAggregateSubQuery() if (!Dialect.SupportsScalarSubSelects) Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); - var timesheets = (from timesheet in db.Timesheets + var timesheets = (from timesheet in db.Timesheets orderby timesheet.Id select new { timesheet.Id, From 23652832256034fefb17f3466336e608a8f2c5bd Mon Sep 17 00:00:00 2001 From: Jonathan Bregler Date: Wed, 2 May 2018 16:16:01 +0200 Subject: [PATCH 11/12] Changes for the HANA row store dialect - Add separate drivers for row and column stores since the row store doesn't support system transactions - Disable support for distributed transactions and select for update on multiple tabled in the row store dialect - Skip NHibernate.Test.ReadOnly.TextHolder because the HANA row store doesn't support the TEXT data type --- src/NHibernate.Config.Templates/HANA.cfg.xml | 2 +- .../SystemTransactionFixture.cs | 2 +- src/NHibernate.Test/ReadOnly/TextHolder.cs | 2 +- .../SystemTransactionFixture.cs | 2 +- .../TestDialects/HanaRowStoreTestDialect.cs | 2 ++ .../Dialect/HanaColumnStoreDialect.cs | 9 ++++++- src/NHibernate/Dialect/HanaDialectBase.cs | 18 +------------ src/NHibernate/Dialect/HanaRowStoreDialect.cs | 17 ++++++++++-- .../Driver/HanaColumnStoreDriver.cs | 24 +++++++++++++++++ .../{HanaDriver.cs => HanaDriverBase.cs} | 19 +++----------- src/NHibernate/Driver/HanaRowStoreDriver.cs | 26 +++++++++++++++++++ 11 files changed, 84 insertions(+), 39 deletions(-) create mode 100644 src/NHibernate/Driver/HanaColumnStoreDriver.cs rename src/NHibernate/Driver/{HanaDriver.cs => HanaDriverBase.cs} (67%) create mode 100644 src/NHibernate/Driver/HanaRowStoreDriver.cs diff --git a/src/NHibernate.Config.Templates/HANA.cfg.xml b/src/NHibernate.Config.Templates/HANA.cfg.xml index 539e2db7688..f2131496105 100644 --- a/src/NHibernate.Config.Templates/HANA.cfg.xml +++ b/src/NHibernate.Config.Templates/HANA.cfg.xml @@ -6,7 +6,7 @@ for your own use before compile tests in VisualStudio. --> - NHibernate.Driver.HanaDriver + NHibernate.Driver.HanaColumnStoreDriver diff --git a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs index fa4b3af96d9..ff3ea86958f 100644 --- a/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs +++ b/src/NHibernate.Test/Async/SystemTransactions/SystemTransactionFixture.cs @@ -196,7 +196,7 @@ public async Task CanUseSessionWithManyScopesAsync(bool explicitFlush) // on concurrent threads. This creates race conditions when chaining scopes, the subsequent scope usage // finding the connection still enlisted in the previous transaction, its complete being still not finished // on its own thread. - if (Sfi.ConnectionProvider.Driver is HanaDriver) + if (Sfi.ConnectionProvider.Driver is HanaDriverBase) Assert.Ignore("SAP HANA scope handling causes concurrency issues preventing chaining scope usages."); using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession()) diff --git a/src/NHibernate.Test/ReadOnly/TextHolder.cs b/src/NHibernate.Test/ReadOnly/TextHolder.cs index 8b17f5107c1..f0561a59d5d 100644 --- a/src/NHibernate.Test/ReadOnly/TextHolder.cs +++ b/src/NHibernate.Test/ReadOnly/TextHolder.cs @@ -10,7 +10,7 @@ public class TextHolder /// public static bool SupportedForDialect(Dialect.Dialect dialect) { - return !(dialect is FirebirdDialect || dialect is Oracle8iDialect || dialect is MsSqlCeDialect); + return !(dialect is FirebirdDialect || dialect is Oracle8iDialect || dialect is MsSqlCeDialect || dialect is HanaRowStoreDialect); } diff --git a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs index 781c17631ce..cf0fe078414 100644 --- a/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs +++ b/src/NHibernate.Test/SystemTransactions/SystemTransactionFixture.cs @@ -185,7 +185,7 @@ public void CanUseSessionWithManyScopes(bool explicitFlush) // on concurrent threads. This creates race conditions when chaining scopes, the subsequent scope usage // finding the connection still enlisted in the previous transaction, its complete being still not finished // on its own thread. - if (Sfi.ConnectionProvider.Driver is HanaDriver) + if (Sfi.ConnectionProvider.Driver is HanaDriverBase) Assert.Ignore("SAP HANA scope handling causes concurrency issues preventing chaining scope usages."); using (var s = WithOptions().ConnectionReleaseMode(ConnectionReleaseMode.OnClose).OpenSession()) diff --git a/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs index 92b0e49cf07..2f129f262f9 100644 --- a/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs +++ b/src/NHibernate.Test/TestDialects/HanaRowStoreTestDialect.cs @@ -6,5 +6,7 @@ public HanaRowStoreTestDialect(Dialect.Dialect dialect) : base(dialect) { } + + public override bool SupportsSelectForUpdateOnOuterJoin => false; } } diff --git a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs index 3da6fcff35a..e508022f9b4 100644 --- a/src/NHibernate/Dialect/HanaColumnStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaColumnStoreDialect.cs @@ -1,3 +1,5 @@ +using Environment = NHibernate.Cfg.Environment; + namespace NHibernate.Dialect { /// @@ -12,12 +14,17 @@ namespace NHibernate.Dialect /// /// /// connection.driver_class - /// + /// /// /// /// public class HanaColumnStoreDialect : HanaDialectBase { + public HanaColumnStoreDialect() + { + DefaultProperties[Environment.ConnectionDriver] = typeof(NHibernate.Driver.HanaColumnStoreDriver).FullName; + } + /// public override string CreateTableString => "create column table"; diff --git a/src/NHibernate/Dialect/HanaDialectBase.cs b/src/NHibernate/Dialect/HanaDialectBase.cs index ef0dc2922a1..66fdd36437d 100644 --- a/src/NHibernate/Dialect/HanaDialectBase.cs +++ b/src/NHibernate/Dialect/HanaDialectBase.cs @@ -8,26 +8,12 @@ using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Type; -using Environment = NHibernate.Cfg.Environment; namespace NHibernate.Dialect { /// /// A SQL dialect base class for SAP HANA /// - /// - /// The HanaDialectBase defaults the following configuration properties: - /// - /// - /// Property - /// Default Value - /// - /// - /// connection.driver_class - /// - /// - /// - /// public abstract class HanaDialectBase : Dialect { [Serializable] @@ -129,8 +115,6 @@ protected HanaDialectBase() //functions: RegisterFunctions(); - - DefaultProperties[Environment.ConnectionDriver] = "NHibernate.Driver.HanaDriver"; } #region private static readonly string[] DialectKeywords = { ... } @@ -916,7 +900,7 @@ public override string GetSelectClauseNullString(SqlType sqlType) public override bool SupportsEmptyInList => false; /// - public override bool SupportsRowValueConstructorSyntax => true; + public override bool SupportsRowValueConstructorSyntax => false; // HANA supports this, but setting it to true causes the tests NH2294 and NH2394 to fail (see issue #1676) /// public override bool SupportsRowValueConstructorSyntaxInInList => true; diff --git a/src/NHibernate/Dialect/HanaRowStoreDialect.cs b/src/NHibernate/Dialect/HanaRowStoreDialect.cs index 87ce928e12b..e94be1928b5 100644 --- a/src/NHibernate/Dialect/HanaRowStoreDialect.cs +++ b/src/NHibernate/Dialect/HanaRowStoreDialect.cs @@ -1,10 +1,12 @@ +using Environment = NHibernate.Cfg.Environment; + namespace NHibernate.Dialect { /// /// A SQL dialect for the SAP HANA row store /// /// - /// The HanaColumnStoreDialect defaults the following configuration properties: + /// The HanaRowStoreDialect defaults the following configuration properties: /// /// /// Property @@ -12,16 +14,27 @@ namespace NHibernate.Dialect /// /// /// connection.driver_class - /// + /// /// /// /// public class HanaRowStoreDialect : HanaDialectBase { + public HanaRowStoreDialect() + { + DefaultProperties[Environment.ConnectionDriver] = typeof(NHibernate.Driver.HanaRowStoreDriver).FullName; + } + /// public override string CreateTableString => "create row table"; /// public override string CreateTemporaryTableString => "create local temporary row table"; + + /// + public override bool SupportsOuterJoinForUpdate => false; + + /// + public override bool SupportsDistributedTransactions => false; } } diff --git a/src/NHibernate/Driver/HanaColumnStoreDriver.cs b/src/NHibernate/Driver/HanaColumnStoreDriver.cs new file mode 100644 index 00000000000..75c339767e6 --- /dev/null +++ b/src/NHibernate/Driver/HanaColumnStoreDriver.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Driver +{ + /// + /// Provides a database driver for the SAP HANA column store. + /// + /// + /// + /// In order to use this driver you must have the assembly Sap.Data.Hana.v4.5.dll available for + /// NHibernate to load, including its dependencies (libadonetHDB.dll and libSQLDBCHDB.dll + /// are required by the assembly Sap.Data.Hana.v4.5.dll as of the time of this writing). + /// + /// + /// Please check the product's website + /// for any updates and/or documentation regarding SAP HANA. + /// + /// + public class HanaColumnStoreDriver : HanaDriverBase + { + } +} diff --git a/src/NHibernate/Driver/HanaDriver.cs b/src/NHibernate/Driver/HanaDriverBase.cs similarity index 67% rename from src/NHibernate/Driver/HanaDriver.cs rename to src/NHibernate/Driver/HanaDriverBase.cs index 850b01f6c22..aa01f55fe1e 100644 --- a/src/NHibernate/Driver/HanaDriver.cs +++ b/src/NHibernate/Driver/HanaDriverBase.cs @@ -3,28 +3,17 @@ namespace NHibernate.Driver { /// - /// Provides a database driver for SAP HANA. + /// Provides a database driver base class for SAP HANA. /// - /// - /// - /// In order to use this driver you must have the assembly Sap.Data.Hana.v4.5.dll available for - /// NHibernate to load, including its dependencies (libadonetHDB.dll and libSQLDBCHDB.dll - /// are required by the assembly Sap.Data.Hana.v4.5.dll as of the time of this writing). - /// - /// - /// Please check the product's website - /// for any updates and/or documentation regarding SAP HANA. - /// - /// - public class HanaDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider + public abstract class HanaDriverBase : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Thrown when the Sap.Data.Hana.v4.5 assembly can not be loaded. /// - public HanaDriver() : base( + protected HanaDriverBase() : base( "Sap.Data.Hana", "Sap.Data.Hana.v4.5", "Sap.Data.Hana.HanaConnection", diff --git a/src/NHibernate/Driver/HanaRowStoreDriver.cs b/src/NHibernate/Driver/HanaRowStoreDriver.cs new file mode 100644 index 00000000000..8b09bea9a9d --- /dev/null +++ b/src/NHibernate/Driver/HanaRowStoreDriver.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Driver +{ + /// + /// Provides a database driver for the SAP HANA row store. + /// + /// + /// + /// In order to use this driver you must have the assembly Sap.Data.Hana.v4.5.dll available for + /// NHibernate to load, including its dependencies (libadonetHDB.dll and libSQLDBCHDB.dll + /// are required by the assembly Sap.Data.Hana.v4.5.dll as of the time of this writing). + /// + /// + /// Please check the product's website + /// for any updates and/or documentation regarding SAP HANA. + /// + /// + public class HanaRowStoreDriver : HanaDriverBase + { + /// + public override bool SupportsSystemTransactions => false; + } +} From 4ae2055b85d735b73f07e6ed1c957d33ab3ab5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= Date: Mon, 7 May 2018 18:55:54 +0200 Subject: [PATCH 12/12] Ignore more unsupported tests for Hana --- .../Insertordering/FamilyModel/Fixture.cs | 7 +++++- .../Async/Legacy/FooBarTest.cs | 3 +++ .../Async/NHSpecificTest/Logs/LogsFixture.cs | 5 ++++ .../Async/NHSpecificTest/NH280/Fixture.cs | 25 +++++++++++-------- .../Properties/CompositePropertyRefTest.cs | 5 ++++ .../Properties/DynamicEntityTest.cs | 5 ++++ .../Insertordering/FamilyModel/Fixture.cs | 7 +++++- src/NHibernate.Test/Legacy/FooBarTest.cs | 3 +++ .../NHSpecificTest/Logs/LogsFixture.cs | 5 ++++ .../NH1908ThreadSafety/Fixture.cs | 3 ++- .../NHSpecificTest/NH2192/Fixture.cs | 5 ++++ .../NHSpecificTest/NH280/Fixture.cs | 25 +++++++++++-------- .../NHSpecificTest/NH3436/Fixture.cs | 5 ++++ .../Properties/CompositePropertyRefTest.cs | 5 ++++ .../Properties/DynamicEntityTest.cs | 5 ++++ src/NHibernate.Test/TestDialect.cs | 21 ++++++++++++++++ .../HanaColumnStoreTestDialect.cs | 7 ++++++ .../TestDialects/HanaTestDialectBase.cs | 22 ++++++++++++++++ 18 files changed, 140 insertions(+), 23 deletions(-) diff --git a/src/NHibernate.Test/Async/Insertordering/FamilyModel/Fixture.cs b/src/NHibernate.Test/Async/Insertordering/FamilyModel/Fixture.cs index 44441799c8d..759d0621f85 100644 --- a/src/NHibernate.Test/Async/Insertordering/FamilyModel/Fixture.cs +++ b/src/NHibernate.Test/Async/Insertordering/FamilyModel/Fixture.cs @@ -29,6 +29,11 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsBatchingDependentDML; + } + protected override void Configure(Configuration configuration) { configuration.DataBaseIntegration(x => @@ -105,4 +110,4 @@ public async System.Threading.Tasks.Task CircularReferencesAsync() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs index 826288d13a1..4af220a1377 100644 --- a/src/NHibernate.Test/Async/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Async/Legacy/FooBarTest.cs @@ -4103,6 +4103,9 @@ public async Task UpdateOrderAsync() [Test] public async Task UpdateFromTransientAsync() { + if (!TestDialect.SupportsBatchingDependentDML) + Assert.Ignore($"Dialect {Dialect} does not support batching of dependent DML (fee update on related fee)"); + ISession s = OpenSession(); Fee fee1 = new Fee(); await (s.SaveAsync(fee1)); diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs index 71ada7ac57e..928af230f23 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Logs/LogsFixture.cs @@ -147,6 +147,11 @@ public async Task WillGetSessionIdFromInterlacedSessionsLogsAsync() [Test] public async Task WillGetSessionIdFromSessionLogsConcurrentAsync() { + if (!TestDialect.SupportsConcurrencyTests) + { + Assert.Ignore($"Dialect {Dialect} does not supports concurrency tests"); + } + GlobalContext.Properties["sessionId"] = new SessionIdCapturer(); // Do not use a ManualResetEventSlim, it does not support async and exhausts the task thread pool in the diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH280/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH280/Fixture.cs index b91759d98e4..28733b03c12 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH280/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH280/Fixture.cs @@ -37,16 +37,21 @@ public async Task ConstInSelectAsync() await (s.SaveAsync(f)); await (s.FlushAsync()); - IList l = await (s.CreateQuery("select 'TextConst', 123, 123.5, .5 from Foo").ListAsync()); - IList result = l[0] as IList; - Assert.AreEqual(typeof(string), result[0].GetType()); - Assert.AreEqual(typeof(Int32), result[1].GetType()); - Assert.AreEqual(typeof(Double), result[2].GetType()); - Assert.AreEqual(typeof(Double), result[3].GetType()); - Assert.AreEqual("TextConst", result[0]); - Assert.AreEqual(123, result[1]); - Assert.AreEqual(123.5D, result[2]); - Assert.AreEqual(0.5D, result[3]); + IList l; + IList result; + if (TestDialect.SupportsSelectingDoubleLiteral) + { + l = await (s.CreateQuery("select 'TextConst', 123, 123.5, .5 from Foo").ListAsync()); + result = l[0] as IList; + Assert.AreEqual(typeof(string), result[0].GetType()); + Assert.AreEqual(typeof(Int32), result[1].GetType()); + Assert.AreEqual(typeof(Double), result[2].GetType()); + Assert.AreEqual(typeof(Double), result[3].GetType()); + Assert.AreEqual("TextConst", result[0]); + Assert.AreEqual(123, result[1]); + Assert.AreEqual(123.5D, result[2]); + Assert.AreEqual(0.5D, result[3]); + } l = await (s.CreateQuery("select 123, f from Foo f").ListAsync()); result = l[0] as IList; diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs index 35d73040c17..31de09b83e7 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -21,6 +21,11 @@ public class CompositePropertyRefTestAsync : BugTestCase private long p_id; private long p2_id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsFKOnCompositeKeyWithBoolean; + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs index 90fa8b3a468..21c46451346 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -18,6 +18,11 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTestAsync : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsFKOnCompositeKeyWithBoolean; + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/Insertordering/FamilyModel/Fixture.cs b/src/NHibernate.Test/Insertordering/FamilyModel/Fixture.cs index 845dc19d58e..8f85ad8ee20 100644 --- a/src/NHibernate.Test/Insertordering/FamilyModel/Fixture.cs +++ b/src/NHibernate.Test/Insertordering/FamilyModel/Fixture.cs @@ -19,6 +19,11 @@ protected override string MappingsAssembly get { return "NHibernate.Test"; } } + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsBatchingDependentDML; + } + protected override void Configure(Configuration configuration) { configuration.DataBaseIntegration(x => @@ -95,4 +100,4 @@ public void CircularReferences() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Legacy/FooBarTest.cs b/src/NHibernate.Test/Legacy/FooBarTest.cs index e099aa30ffe..7be39e672f8 100644 --- a/src/NHibernate.Test/Legacy/FooBarTest.cs +++ b/src/NHibernate.Test/Legacy/FooBarTest.cs @@ -4091,6 +4091,9 @@ public void UpdateOrder() [Test] public void UpdateFromTransient() { + if (!TestDialect.SupportsBatchingDependentDML) + Assert.Ignore($"Dialect {Dialect} does not support batching of dependent DML (fee update on related fee)"); + ISession s = OpenSession(); Fee fee1 = new Fee(); s.Save(fee1); diff --git a/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs b/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs index 525535fbbb0..144f6002f10 100644 --- a/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/Logs/LogsFixture.cs @@ -136,6 +136,11 @@ public void WillGetSessionIdFromInterlacedSessionsLogs() [Test] public void WillGetSessionIdFromSessionLogsConcurrent() { + if (!TestDialect.SupportsConcurrencyTests) + { + Assert.Ignore($"Dialect {Dialect} does not supports concurrency tests"); + } + GlobalContext.Properties["sessionId"] = new SessionIdCapturer(); // Do not use a ManualResetEventSlim, it does not support async and exhausts the task thread pool in the diff --git a/src/NHibernate.Test/NHSpecificTest/NH1908ThreadSafety/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1908ThreadSafety/Fixture.cs index ee56f076a3f..6daf21a77a6 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1908ThreadSafety/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1908ThreadSafety/Fixture.cs @@ -12,10 +12,11 @@ public class Fixture : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return !(dialect is Oracle8iDialect); // Oracle sometimes causes: ORA-12520: TNS:listener could not find available handler for requested type of server // Following links bizarrely suggest it's an Oracle limitation under load: // http://www.orafaq.com/forum/t/60019/2/ & http://www.ispirer.com/wiki/sqlways/troubleshooting-guide/oracle/import/tns_listener + return !(dialect is Oracle8iDialect) && + TestDialect.SupportsConcurrencyTests; } [Test] diff --git a/src/NHibernate.Test/NHSpecificTest/NH2192/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2192/Fixture.cs index b0a895a0b63..9ec01b44380 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2192/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2192/Fixture.cs @@ -9,6 +9,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2192 [TestFixture] public class Fixture : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsConcurrencyTests; + } + protected override void OnSetUp() { base.OnSetUp(); diff --git a/src/NHibernate.Test/NHSpecificTest/NH280/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH280/Fixture.cs index 459ffdf2f42..d5a5c45a9cf 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH280/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH280/Fixture.cs @@ -26,16 +26,21 @@ public void ConstInSelect() s.Save(f); s.Flush(); - IList l = s.CreateQuery("select 'TextConst', 123, 123.5, .5 from Foo").List(); - IList result = l[0] as IList; - Assert.AreEqual(typeof(string), result[0].GetType()); - Assert.AreEqual(typeof(Int32), result[1].GetType()); - Assert.AreEqual(typeof(Double), result[2].GetType()); - Assert.AreEqual(typeof(Double), result[3].GetType()); - Assert.AreEqual("TextConst", result[0]); - Assert.AreEqual(123, result[1]); - Assert.AreEqual(123.5D, result[2]); - Assert.AreEqual(0.5D, result[3]); + IList l; + IList result; + if (TestDialect.SupportsSelectingDoubleLiteral) + { + l = s.CreateQuery("select 'TextConst', 123, 123.5, .5 from Foo").List(); + result = l[0] as IList; + Assert.AreEqual(typeof(string), result[0].GetType()); + Assert.AreEqual(typeof(Int32), result[1].GetType()); + Assert.AreEqual(typeof(Double), result[2].GetType()); + Assert.AreEqual(typeof(Double), result[3].GetType()); + Assert.AreEqual("TextConst", result[0]); + Assert.AreEqual(123, result[1]); + Assert.AreEqual(123.5D, result[2]); + Assert.AreEqual(0.5D, result[3]); + } l = s.CreateQuery("select 123, f from Foo f").List(); result = l[0] as IList; diff --git a/src/NHibernate.Test/NHSpecificTest/NH3436/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3436/Fixture.cs index be1ac06dc84..88b3a0a67d3 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3436/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3436/Fixture.cs @@ -54,6 +54,11 @@ protected override void OnTearDown() [Test] public void TestQueryWithContainsInParallel() { + if (!TestDialect.SupportsConcurrencyTests) + { + Assert.Ignore($"Dialect {Dialect} does not supports concurrency tests"); + } + var ids = new List { Guid.NewGuid(), diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs index 77893017777..4bbcca81380 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/CompositePropertyRefTest.cs @@ -10,6 +10,11 @@ public class CompositePropertyRefTest : BugTestCase private long p_id; private long p2_id; + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsFKOnCompositeKeyWithBoolean; + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs index 7c5a7ba4b16..f981231b461 100644 --- a/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/Properties/DynamicEntityTest.cs @@ -7,6 +7,11 @@ namespace NHibernate.Test.NHSpecificTest.Properties [TestFixture] public class DynamicEntityTest : BugTestCase { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return TestDialect.SupportsFKOnCompositeKeyWithBoolean; + } + protected override void OnSetUp() { using (var s = OpenSession()) diff --git a/src/NHibernate.Test/TestDialect.cs b/src/NHibernate.Test/TestDialect.cs index 01f3d77b444..b18a5c556d9 100644 --- a/src/NHibernate.Test/TestDialect.cs +++ b/src/NHibernate.Test/TestDialect.cs @@ -107,5 +107,26 @@ public bool SupportsSqlType(SqlType sqlType) /// Supports order by and limits/top in correlated sub-queries /// public virtual bool SupportsOrderByAndLimitInSubQueries => true; + + /// + /// Supports selecting a double literal. + /// + public virtual bool SupportsSelectingDoubleLiteral => true; + + /// + /// Supports foreign keys on composite keys including a boolean column. + /// + public virtual bool SupportsFKOnCompositeKeyWithBoolean => true; + + /// + /// Supports tests involving concurrency. + /// + public virtual bool SupportsConcurrencyTests => true; + + /// + /// Supports batching together inserts/updates/Delets among which some depends (auto foreign key) on others + /// in the batch. + /// + public virtual bool SupportsBatchingDependentDML => true; } } diff --git a/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs index 6ff9d0269ac..e85ef979b24 100644 --- a/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs +++ b/src/NHibernate.Test/TestDialects/HanaColumnStoreTestDialect.cs @@ -6,5 +6,12 @@ public HanaColumnStoreTestDialect(Dialect.Dialect dialect) : base(dialect) { } + + /// + /// + /// When the target table is a column store, HANA 2 SP3 with its .Net data provider fails to process DML of + /// a batch of rows when some of them depends on other rows of the batch. + /// + public override bool SupportsBatchingDependentDML => false; } } diff --git a/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs index 1ba43127330..c44c8099854 100644 --- a/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs +++ b/src/NHibernate.Test/TestDialects/HanaTestDialectBase.cs @@ -23,5 +23,27 @@ protected HanaTestDialectBase(Dialect.Dialect dialect) /// HANA 2 SP3 yields in such case: correlated subquery cannot have TOP or ORDER BY /// public override bool SupportsOrderByAndLimitInSubQueries => false; + + /// + /// + /// HANA 2 SP3 with its .Net data provider yields 0 instead of the value. + /// + public override bool SupportsSelectingDoubleLiteral => false; + + /// + /// + /// HANA 2 SP3 fails creating the foreign key with the message + /// "expression is of wrong type: cannot convert 'boolean' to 'varchar'". + /// + public override bool SupportsFKOnCompositeKeyWithBoolean => false; + + /// + /// + /// HANA 2 SP3 with its .Net data provider regularly fails to open connections in tests involving + /// many parallel connection openings. It yields a message beginning with "Could not open connection to:" + /// followed by the connection string, with a System.Runtime.InteropServices.SEHException inner + /// exception (External component has thrown an exception). + /// + public override bool SupportsConcurrencyTests => false; } }