diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3327/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3327/Fixture.cs new file mode 100644 index 00000000000..b34a71f1317 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3327/Fixture.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3327 +{ + using System.Threading.Tasks; + [TestFixture] + public class FixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var t = session.BeginTransaction(); + var parent = new Entity { Name = "Parent" }; + var child = new ChildEntity { Name = "Child", Parent = parent }; + session.Save(parent); + session.Save(child); + t.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from ChildEntity").ExecuteUpdate(); + session.CreateQuery("delete from Entity").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public async Task NotIsCorrectlyHandledAsync() + { + using var session = OpenSession(); + var q = session.CreateQuery( + @"SELECT COUNT(ROOT.Id) + FROM Entity AS ROOT + WHERE ( + EXISTS (FROM ChildEntity AS CHILD WHERE CHILD.Parent = ROOT) + AND ROOT.Name = 'Parent' + )"); + Assert.That((await (q.ListAsync()))[0], Is.EqualTo(1)); + + q = session.CreateQuery( + @"SELECT COUNT(ROOT.Id) + FROM Entity AS ROOT + WHERE NOT ( + EXISTS (FROM ChildEntity AS CHILD WHERE CHILD.Parent = ROOT) + AND ROOT.Name = 'Parent' + )"); + Assert.That((await (q.ListAsync()))[0], Is.EqualTo(0)); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3327/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH3327/Entity.cs new file mode 100644 index 00000000000..9f9b2bafce2 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3327/Entity.cs @@ -0,0 +1,17 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.GH3327 +{ + public class Entity + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } + + public class ChildEntity + { + public virtual int Id { get; set; } + public virtual Entity Parent { get; set; } + public virtual string Name { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3327/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3327/Fixture.cs new file mode 100644 index 00000000000..aef1a40243e --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3327/Fixture.cs @@ -0,0 +1,52 @@ +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3327 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var t = session.BeginTransaction(); + var parent = new Entity { Name = "Parent" }; + var child = new ChildEntity { Name = "Child", Parent = parent }; + session.Save(parent); + session.Save(child); + t.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.CreateQuery("delete from ChildEntity").ExecuteUpdate(); + session.CreateQuery("delete from Entity").ExecuteUpdate(); + + transaction.Commit(); + } + + [Test] + public void NotIsCorrectlyHandled() + { + using var session = OpenSession(); + var q = session.CreateQuery( + @"SELECT COUNT(ROOT.Id) + FROM Entity AS ROOT + WHERE ( + EXISTS (FROM ChildEntity AS CHILD WHERE CHILD.Parent = ROOT) + AND ROOT.Name = 'Parent' + )"); + Assert.That(q.List()[0], Is.EqualTo(1)); + + q = session.CreateQuery( + @"SELECT COUNT(ROOT.Id) + FROM Entity AS ROOT + WHERE NOT ( + EXISTS (FROM ChildEntity AS CHILD WHERE CHILD.Parent = ROOT) + AND ROOT.Name = 'Parent' + )"); + Assert.That(q.List()[0], Is.EqualTo(0)); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3327/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3327/Mappings.hbm.xml new file mode 100644 index 00000000000..a6eee729fae --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3327/Mappings.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlParser.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlParser.cs index f33f8b13acb..6c05fc6c999 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlParser.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlParser.cs @@ -214,14 +214,14 @@ public IASTNode NegateNode(IASTNode node) case OR: node.Type = AND; node.Text = "{and}"; - NegateNode(node.GetChild(0)); - NegateNode(node.GetChild(1)); + node.SetChild(0, NegateNode(node.GetChild(0))); + node.SetChild(1, NegateNode(node.GetChild(1))); return node; case AND: node.Type = OR; node.Text = "{or}"; - NegateNode(node.GetChild(0)); - NegateNode(node.GetChild(1)); + node.SetChild(0, NegateNode(node.GetChild(0))); + node.SetChild(1, NegateNode(node.GetChild(1))); return node; case EQ: node.Type = NE;