Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test case for NH-3972 - SQL error when selecting a column of a subclass when sibling classes have a column of the same name #2242

Merged
merged 19 commits into from
Oct 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions src/NHibernate.Test/Async/NHSpecificTest/NH3972/Fixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by AsyncGenerator.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------


using System;
using System.Linq;
using NUnit.Framework;
using NHibernate.Linq;

namespace NHibernate.Test.NHSpecificTest.NH3972
{
using System.Threading.Tasks;
[KnownBug("NH-3972(GH-1189)")]
[TestFixture]
public class FixtureAsync : BugTestCase
{
private DataChangeState changeState = null;
private DataRequestForChangeState rfcState = null;
private DataIncidentState incidentState = null;
private DataProblemState problemState = null;

protected override void OnSetUp()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
foreach (ChangeInternalState state in Enum.GetValues(typeof(ChangeInternalState)))
{
changeState = new DataChangeState { State = state, Description = Enum.GetName(typeof(ChangeInternalState), state) };
session.Save(changeState);
}

foreach (RequestForChangeInternalState state in Enum.GetValues(typeof(RequestForChangeInternalState)))
{
rfcState = new DataRequestForChangeState { State = state, Description = Enum.GetName(typeof(RequestForChangeInternalState), state) };
session.Save(rfcState);
}

foreach (IncidentInternalState state in Enum.GetValues(typeof(IncidentInternalState)))
{
incidentState = new DataIncidentState { State = state, Description = Enum.GetName(typeof(IncidentInternalState), state) };
session.Save(incidentState);
}

foreach (ProblemInternalState state in Enum.GetValues(typeof(ProblemInternalState)))
{
problemState = new DataProblemState { State = state, Description = Enum.GetName(typeof(ProblemInternalState), state) };
session.Save(problemState);
}

session.Save(new RequestForChange { Subject = "I have a request", State = rfcState });
session.Save(new Change { Subject = "I have changed the following stuff", State = changeState, ExecutedBy = "Me" });
session.Save(new Incident { Subject = "Can someone look for this", State = incidentState, ReportedBy = "Someone" });
session.Save(new Problem { Subject = "We have a problem", State = problemState });

session.Flush();
transaction.Commit();
}
}

protected override void OnTearDown()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
session.Delete("from System.Object");

session.Flush();
transaction.Commit();
}
}

[Test]
public async Task QueryingAllAsync()
{
using (var session = OpenSession())
{
var result = await (session.Query<DataRecord>().ToListAsync());
Assert.That(result.Count, Is.EqualTo(4));
}
}

[Test]
public async Task QueryingSubPropertiesWithDifferentNamesAsync()
{
using (var session = OpenSession())
{
var result = await (session.Query<DataRecord>().Select(x => new
{
x.Subject,
((Incident) x).ReportedBy,
((Change) x).ExecutedBy
}).ToListAsync());
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.ReportedBy == "Someone") == 1, Is.True); // there is one entity with a set ReportedBy column, i.e. the entity of type "Incident"
Assert.That(result.Count(x => x.ExecutedBy == "Me") == 1, Is.True); // there is one entity with a set ExecutedBy column, i.e. the entity of type "Change"
}
}

[Test]
public async Task QueryingSubPropertyWithTheSameNameAsync()
{
using (var session = OpenSession())
{
var result = await (session.Query<DataRecord>().Select(x => new
{
x.Subject,
IncidentState = ((Incident) x).State.Description
}).ToListAsync());
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True);
}
}

[Test]
public async Task QueryingSubPropertiesWithTheSameNamesAsync()
{
using (var session = OpenSession())
{
var result = await (session.Query<DataRecord>().Select(x => new
{
x.Subject,
IncidentState = ((Incident) x).State.Description,
ChangeState = ((Change) x).State.Description
}).ToListAsync());
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True); // there is only one "Incident" entity
Assert.That(result.Count(x => x.ChangeState == changeState.Description) == 1, Is.True); // there is only one "Change" entity
}
}
}
}
14 changes: 14 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/Change.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public class Change : DataRecord
{
public Change()
{
Type = DataRecordType.Change;
}

public virtual DataChangeState State { get; set; }

public virtual string ExecutedBy { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/DataChangeState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public enum ChangeInternalState { New, Completed }

public class DataChangeState : DataState
{
public DataChangeState()
{
Type = DataRecordType.Change;
}

public virtual ChangeInternalState State { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/DataIncidentState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public enum IncidentInternalState { New, Assigned, Closed, Solved }

public class DataIncidentState : DataState
{
public DataIncidentState()
{
Type = DataRecordType.Incident;
}

public virtual IncidentInternalState State { get; set; }
}
}
14 changes: 14 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/DataProblemState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public enum ProblemInternalState { New, Closed }

public class DataProblemState : DataState
{
public DataProblemState()
{
Type = DataRecordType.Problem;
}

public virtual ProblemInternalState State { get; set; }
}
}
19 changes: 19 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/DataRecord.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Diagnostics;

namespace NHibernate.Test.NHSpecificTest.NH3972
{
public enum DataRecordType
{
Incident,
Problem,
RequestForChange,
Change
}

[DebuggerDisplay("{Subject}")]
public class DataRecord : Entity
{
public virtual DataRecordType Type { get; set; }
public virtual string Subject { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public enum RequestForChangeInternalState { New, Orded, Closed, Cancelled }

public class DataRequestForChangeState : DataState
{
public DataRequestForChangeState()
{
Type = DataRecordType.RequestForChange;
}

public virtual RequestForChangeInternalState State { get; set; }
}
}
11 changes: 11 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/DataState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Diagnostics;

namespace NHibernate.Test.NHSpecificTest.NH3972
{
[DebuggerDisplay("{Description}")]
public class DataState : Entity
{
public virtual DataRecordType Type { get; set; }
public virtual string Description { get; set; }
}
}
10 changes: 10 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/Entity.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;

namespace NHibernate.Test.NHSpecificTest.NH3972
{
public class Entity
{
public virtual Guid Id { get; set; }
public virtual int Version { get; set; }
}
}
126 changes: 126 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/Fixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using System;
using System.Linq;
using NUnit.Framework;

namespace NHibernate.Test.NHSpecificTest.NH3972
{
[KnownBug("NH-3972(GH-1189)")]
[TestFixture]
public class Fixture : BugTestCase
{
private DataChangeState changeState = null;
private DataRequestForChangeState rfcState = null;
private DataIncidentState incidentState = null;
private DataProblemState problemState = null;

protected override void OnSetUp()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
foreach (ChangeInternalState state in Enum.GetValues(typeof(ChangeInternalState)))
{
changeState = new DataChangeState { State = state, Description = Enum.GetName(typeof(ChangeInternalState), state) };
session.Save(changeState);
}

foreach (RequestForChangeInternalState state in Enum.GetValues(typeof(RequestForChangeInternalState)))
{
rfcState = new DataRequestForChangeState { State = state, Description = Enum.GetName(typeof(RequestForChangeInternalState), state) };
session.Save(rfcState);
}

foreach (IncidentInternalState state in Enum.GetValues(typeof(IncidentInternalState)))
{
incidentState = new DataIncidentState { State = state, Description = Enum.GetName(typeof(IncidentInternalState), state) };
session.Save(incidentState);
}

foreach (ProblemInternalState state in Enum.GetValues(typeof(ProblemInternalState)))
{
problemState = new DataProblemState { State = state, Description = Enum.GetName(typeof(ProblemInternalState), state) };
session.Save(problemState);
}

session.Save(new RequestForChange { Subject = "I have a request", State = rfcState });
session.Save(new Change { Subject = "I have changed the following stuff", State = changeState, ExecutedBy = "Me" });
session.Save(new Incident { Subject = "Can someone look for this", State = incidentState, ReportedBy = "Someone" });
session.Save(new Problem { Subject = "We have a problem", State = problemState });

session.Flush();
transaction.Commit();
}
}

protected override void OnTearDown()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
session.Delete("from System.Object");

session.Flush();
transaction.Commit();
}
}

[Test]
public void QueryingAll()
{
using (var session = OpenSession())
{
var result = session.Query<DataRecord>().ToList();
Assert.That(result.Count, Is.EqualTo(4));
}
}

[Test]
public void QueryingSubPropertiesWithDifferentNames()
{
using (var session = OpenSession())
{
var result = session.Query<DataRecord>().Select(x => new
{
x.Subject,
((Incident) x).ReportedBy,
((Change) x).ExecutedBy
}).ToList();
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.ReportedBy == "Someone") == 1, Is.True); // there is one entity with a set ReportedBy column, i.e. the entity of type "Incident"
Assert.That(result.Count(x => x.ExecutedBy == "Me") == 1, Is.True); // there is one entity with a set ExecutedBy column, i.e. the entity of type "Change"
}
}

[Test]
public void QueryingSubPropertyWithTheSameName()
{
using (var session = OpenSession())
{
var result = session.Query<DataRecord>().Select(x => new
{
x.Subject,
IncidentState = ((Incident) x).State.Description
}).ToList();
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True);
}
}

[Test]
public void QueryingSubPropertiesWithTheSameNames()
{
using (var session = OpenSession())
{
var result = session.Query<DataRecord>().Select(x => new
{
x.Subject,
IncidentState = ((Incident) x).State.Description,
ChangeState = ((Change) x).State.Description
}).ToList();
Assert.That(result.Count, Is.EqualTo(4));
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True); // there is only one "Incident" entity
Assert.That(result.Count(x => x.ChangeState == changeState.Description) == 1, Is.True); // there is only one "Change" entity
}
}
}
}
14 changes: 14 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/NH3972/Incident.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace NHibernate.Test.NHSpecificTest.NH3972
{
public class Incident : DataRecord
{
public Incident()
{
Type = DataRecordType.Incident;
}

public virtual DataIncidentState State { get; set; }

public virtual string ReportedBy { get; set; }
}
}
Loading