diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs
new file mode 100644
index 00000000000..cb0f1e2cd1a
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Entity.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.GH2099
+{
+ abstract class PersistentObject
+ {
+ public virtual Guid Id { get; set; }
+ public virtual bool PDO_Deleted { get; set; }
+ }
+
+ class WorkflowInstance : PersistentObject
+ {
+ public virtual bool IsWaiting { get; set; }
+ }
+
+ class Level3 : WorkflowInstance
+ {
+ public virtual bool IsActive { get; set; }
+ }
+
+ class WorkflowInstance2 : PersistentObject
+ {
+ public virtual bool IsActive { get; set; }
+ public virtual bool IsWaiting { get; set; }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs
new file mode 100644
index 00000000000..d2ac2c46bb8
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Fixture.cs
@@ -0,0 +1,27 @@
+using System.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2099
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ }
+
+ protected override void OnTearDown()
+ {
+ }
+
+ [Test]
+ public void BaseClassCanShareIndexNameWithSubclass()
+ {
+ var table = cfg.CreateMappings().IterateTables.FirstOrDefault(t => t.Name == "Level3");
+
+ var index = table.GetIndex("CF_BASE_IDX");
+ Assert.That(index?.ColumnSpan, Is.EqualTo(3));
+ Assert.That(index.ColumnIterator.FirstOrDefault(c => c.Name == "PDO_Deleted"), Is.Not.Null);
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml
new file mode 100644
index 00000000000..128242e2aee
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2099/Mappings.hbm.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate/Mapping/DenormalizedTable.cs b/src/NHibernate/Mapping/DenormalizedTable.cs
index 24e2a14c5ab..bfb814e2858 100644
--- a/src/NHibernate/Mapping/DenormalizedTable.cs
+++ b/src/NHibernate/Mapping/DenormalizedTable.cs
@@ -43,8 +43,16 @@ public override IEnumerable IndexIterator
IEnumerable includedIdxs = includedTable.IndexIterator;
foreach (Index parentIndex in includedIdxs)
{
+ var sharedIndex = GetIndex(parentIndex.Name);
+ if (sharedIndex != null)
+ {
+ sharedIndex.AddColumns(parentIndex.ColumnIterator);
+ sharedIndex.IsInherited = true;
+ continue;
+ }
Index index = new Index();
- index.Name = Name + parentIndex.Name;
+ index.Name = parentIndex.Name;
+ index.IsInherited = true;
index.Table = this;
index.AddColumns(parentIndex.ColumnIterator);
indexes.Add(index);
diff --git a/src/NHibernate/Mapping/Index.cs b/src/NHibernate/Mapping/Index.cs
index 74729189c9b..a29ec92152a 100644
--- a/src/NHibernate/Mapping/Index.cs
+++ b/src/NHibernate/Mapping/Index.cs
@@ -68,7 +68,8 @@ public static string BuildSqlDropIndexString(Dialect.Dialect dialect, Table tabl
///
public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema)
{
- return BuildSqlCreateIndexString(dialect, Name, Table, ColumnIterator, false, defaultCatalog, defaultSchema);
+ var indexName = IsInherited ? Table.Name + Name : Name;
+ return BuildSqlCreateIndexString(dialect, indexName, Table, ColumnIterator, false, defaultCatalog, defaultSchema);
}
///
@@ -144,6 +145,11 @@ public string Name
set { name = value; }
}
+ ///
+ /// Is this index inherited from the base class mapping
+ ///
+ public bool IsInherited { get; set; }
+
public bool ContainsColumn(Column column)
{
return columns.Contains(column);