From 7cd90cc4a273eb2a69ed6a7c3acea17c6c316e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:32:26 +0100 Subject: [PATCH 1/3] Add a test case for #3465 --- .../NHSpecificTest/GH3465/Entities.cs | 20 +++++++++++++++++++ .../NHSpecificTest/GH3465/Fixture.cs | 20 +++++++++++++++++++ .../NHSpecificTest/GH3465/Mappings.hbm.xml | 18 +++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3465/Entities.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3465/Fixture.cs create mode 100644 src/NHibernate.Test/NHSpecificTest/GH3465/Mappings.hbm.xml diff --git a/src/NHibernate.Test/NHSpecificTest/GH3465/Entities.cs b/src/NHibernate.Test/NHSpecificTest/GH3465/Entities.cs new file mode 100644 index 00000000000..3a325ed9ba8 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3465/Entities.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH3465 +{ + class EntityA + { + public virtual Guid Id { get; set; } + public virtual ISet Children { get; set; } + } + class EntityB + { + public virtual Guid Id { get; set; } + public virtual EntityA Parent { get; set; } + } + class EntityC + { + public virtual Guid Id { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3465/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3465/Fixture.cs new file mode 100644 index 00000000000..e51af1211d9 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3465/Fixture.cs @@ -0,0 +1,20 @@ +using System.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3465 +{ + [TestFixture] + public class Fixture : BugTestCase + { + [Test] + public void ThetaJoinSubQuery() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var query = session.CreateQuery("select e.Id from EntityA e where exists (from e.Children b, EntityC c)"); + Assert.DoesNotThrow(() => query.List()); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3465/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3465/Mappings.hbm.xml new file mode 100644 index 00000000000..b89c139fa29 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3465/Mappings.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + From 3f02e7c7dd09f22bfc288982bd994ab8b44f5b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Delaporte?= <12201973+fredericdelaporte@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:14:27 +0100 Subject: [PATCH 2/3] Do not append from element when already in from Fix #3465 --- src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs index a22c13e84ff..ade63aaa929 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs @@ -716,7 +716,7 @@ public void SetOrigin(FromElement origin, bool manyToMany) JoinSequence.SetUseThetaStyle(true); } } - else + else if (Walker.CurrentClauseType != HqlSqlWalker.FROM) { FromClause.AppendFromElement(this); } From 382095b1a689a52be0af87fcd5863c6cd00ee20e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Feb 2024 17:19:45 +0000 Subject: [PATCH 3/3] Generate async files --- .../Async/NHSpecificTest/GH3465/Fixture.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/NHibernate.Test/Async/NHSpecificTest/GH3465/Fixture.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3465/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3465/Fixture.cs new file mode 100644 index 00000000000..8d4b62bb325 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3465/Fixture.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// 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.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3465 +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + [Test] + public void ThetaJoinSubQueryAsync() + { + using (var session = OpenSession()) + using (session.BeginTransaction()) + { + var query = session.CreateQuery("select e.Id from EntityA e where exists (from e.Children b, EntityC c)"); + Assert.DoesNotThrowAsync(() => query.ListAsync()); + } + } + } +}