diff --git a/src/NHibernate.Test/Async/BulkManipulation/HQLBulkOperations.cs b/src/NHibernate.Test/Async/BulkManipulation/HQLBulkOperations.cs index 4dd0de91f8e..2bc13bba995 100644 --- a/src/NHibernate.Test/Async/BulkManipulation/HQLBulkOperations.cs +++ b/src/NHibernate.Test/Async/BulkManipulation/HQLBulkOperations.cs @@ -43,5 +43,21 @@ public async Task SimpleDeleteAsync() await (tx.CommitAsync()); } } + + [Test] + public async Task InsertFromSelectWithMultipleAssociationsAsync() + { + Assume.That(TestDialect.NativeGeneratorSupportsBulkInsertion, + "The dialect does not support a native generator compatible with bulk insertion."); + + using var s = OpenSession(); + using var tx = s.BeginTransaction(); + + await (s.CreateQuery("insert into Enrolment (Course, Student)" + + " select e.Course, e.Student from Enrolment e") + .ExecuteUpdateAsync()); + + await (tx.CommitAsync()); + } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/BulkManipulation/Course.cs b/src/NHibernate.Test/BulkManipulation/Course.cs new file mode 100644 index 00000000000..0ceb699b8f6 --- /dev/null +++ b/src/NHibernate.Test/BulkManipulation/Course.cs @@ -0,0 +1,8 @@ +namespace NHibernate.Test.BulkManipulation +{ + public class Course + { + public virtual long CourseId { get; set; } + public virtual string Description { get; set; } + } +} diff --git a/src/NHibernate.Test/BulkManipulation/Enrolment.cs b/src/NHibernate.Test/BulkManipulation/Enrolment.cs new file mode 100644 index 00000000000..547ecd52640 --- /dev/null +++ b/src/NHibernate.Test/BulkManipulation/Enrolment.cs @@ -0,0 +1,12 @@ +using System; + +namespace NHibernate.Test.BulkManipulation +{ + [Serializable] + public class Enrolment + { + public virtual long EnrolmentId { get; set; } + public virtual Student Student { get; set; } + public virtual Course Course { get; set; } + } +} diff --git a/src/NHibernate.Test/BulkManipulation/Enrolment.hbm.xml b/src/NHibernate.Test/BulkManipulation/Enrolment.hbm.xml new file mode 100644 index 00000000000..84e6a0b293d --- /dev/null +++ b/src/NHibernate.Test/BulkManipulation/Enrolment.hbm.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate.Test/BulkManipulation/HQLBulkOperations.cs b/src/NHibernate.Test/BulkManipulation/HQLBulkOperations.cs index 66883da2301..4338c5148b5 100644 --- a/src/NHibernate.Test/BulkManipulation/HQLBulkOperations.cs +++ b/src/NHibernate.Test/BulkManipulation/HQLBulkOperations.cs @@ -32,5 +32,21 @@ public void SimpleDelete() tx.Commit(); } } + + [Test] + public void InsertFromSelectWithMultipleAssociations() + { + Assume.That(TestDialect.NativeGeneratorSupportsBulkInsertion, + "The dialect does not support a native generator compatible with bulk insertion."); + + using var s = OpenSession(); + using var tx = s.BeginTransaction(); + + s.CreateQuery("insert into Enrolment (Course, Student)" + + " select e.Course, e.Student from Enrolment e") + .ExecuteUpdate(); + + tx.Commit(); + } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/BulkManipulation/Student.cs b/src/NHibernate.Test/BulkManipulation/Student.cs new file mode 100644 index 00000000000..6dd9468adf3 --- /dev/null +++ b/src/NHibernate.Test/BulkManipulation/Student.cs @@ -0,0 +1,8 @@ +namespace NHibernate.Test.BulkManipulation +{ + public class Student + { + public virtual long StudentId { get; set; } + public virtual string Name { get; set; } + } +} diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs index 6119f5642e7..00993891bba 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/SelectClause.cs @@ -494,7 +494,7 @@ private void RenderNonScalarIdentifiers( } var node = (IASTNode) e; - if (processedElements.Add(fromElement)) + if (Walker.IsShallowQuery && node.Type == SqlGenerator.DOT || processedElements.Add(fromElement)) { combinedFromElements.Add(fromElement); RenderNonScalarIdentifiers(fromElement, inheritedExpressions.ContainsKey(e) ? null : e, appender);