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;