From 07c8d4cde7721f28b92b252102023e76a9d4a4fe Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 11 Aug 2021 10:53:34 +0300 Subject: [PATCH 1/2] Fix nullable entity comparison with null and implicit/cross joins --- src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs | 5 +++++ src/NHibernate.Test/Hql/EntityJoinHqlTest.cs | 5 +++++ src/NHibernate/Hql/Ast/ANTLR/SqlGenerator.cs | 11 +++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs index eebd9d8768c..6cbb07ba592 100644 --- a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs @@ -344,10 +344,15 @@ public async Task NullableEntityProjectionAsync() var withValidManyToOneList = await (session.Query().Where(x => x.ManyToOne != null).Select(x => new {x.Name, ManyToOneId = (Guid?) x.ManyToOne.Id}).ToListAsync()); var withValidManyToOneList2 = await (session.CreateQuery("from NullableOwner ex where not ex.ManyToOne is null").ListAsync()); var withNullManyToOneList = await (session.Query().Where(x => x.ManyToOne == null).ToListAsync()); + var withNullManyToOneJoinedList = await ((from x in session.Query() + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToListAsync()); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0)); Assert.That(withNullManyToOneList.Count, Is.EqualTo(2)); + Assert.That(withNullManyToOneJoinedList.Count, Is.EqualTo(2)); } } diff --git a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs index 85164ebb861..c9d887a01fa 100644 --- a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs @@ -332,10 +332,15 @@ public void NullableEntityProjection() var withValidManyToOneList = session.Query().Where(x => x.ManyToOne != null).Select(x => new {x.Name, ManyToOneId = (Guid?) x.ManyToOne.Id}).ToList(); var withValidManyToOneList2 = session.CreateQuery("from NullableOwner ex where not ex.ManyToOne is null").List(); var withNullManyToOneList = session.Query().Where(x => x.ManyToOne == null).ToList(); + var withNullManyToOneJoinedList = (from x in session.Query() + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToList(); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0)); Assert.That(withNullManyToOneList.Count, Is.EqualTo(2)); + Assert.That(withNullManyToOneJoinedList.Count, Is.EqualTo(2)); } } diff --git a/src/NHibernate/Hql/Ast/ANTLR/SqlGenerator.cs b/src/NHibernate/Hql/Ast/ANTLR/SqlGenerator.cs index 0f1c7a64603..20e05086d2a 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/SqlGenerator.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/SqlGenerator.cs @@ -229,8 +229,15 @@ protected virtual void FromFragmentSeparator(IASTNode a) } else { - // these are just two unrelated table references - Out(", "); + if (right.JoinSequence?.IsThetaStyle == false && right.JoinSequence.JoinCount != 0) + { + Out(" "); + } + else + { + // these are just two unrelated table references + Out(", "); + } } } From 58cd0b136e93439baa0880220c51803c3d1c9149 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 11 Aug 2021 11:33:31 +0300 Subject: [PATCH 2/2] formatting --- src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs | 9 +++++---- src/NHibernate.Test/Hql/EntityJoinHqlTest.cs | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs index 6cbb07ba592..95672bab016 100644 --- a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs @@ -344,10 +344,11 @@ public async Task NullableEntityProjectionAsync() var withValidManyToOneList = await (session.Query().Where(x => x.ManyToOne != null).Select(x => new {x.Name, ManyToOneId = (Guid?) x.ManyToOne.Id}).ToListAsync()); var withValidManyToOneList2 = await (session.CreateQuery("from NullableOwner ex where not ex.ManyToOne is null").ListAsync()); var withNullManyToOneList = await (session.Query().Where(x => x.ManyToOne == null).ToListAsync()); - var withNullManyToOneJoinedList = await ((from x in session.Query() - from x2 in session.Query() - where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null - select x2).ToListAsync()); + var withNullManyToOneJoinedList = + await ((from x in session.Query() + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToListAsync()); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0)); diff --git a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs index c9d887a01fa..ac67ccb647e 100644 --- a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs @@ -332,10 +332,11 @@ public void NullableEntityProjection() var withValidManyToOneList = session.Query().Where(x => x.ManyToOne != null).Select(x => new {x.Name, ManyToOneId = (Guid?) x.ManyToOne.Id}).ToList(); var withValidManyToOneList2 = session.CreateQuery("from NullableOwner ex where not ex.ManyToOne is null").List(); var withNullManyToOneList = session.Query().Where(x => x.ManyToOne == null).ToList(); - var withNullManyToOneJoinedList = (from x in session.Query() - from x2 in session.Query() - where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null - select x2).ToList(); + var withNullManyToOneJoinedList = + (from x in session.Query() + from x2 in session.Query() + where x == x2 && x.ManyToOne == null && x.OneToOne.Name == null + select x2).ToList(); Assert.That(fullList.Count, Is.EqualTo(2)); Assert.That(withValidManyToOneList.Count, Is.EqualTo(0)); Assert.That(withValidManyToOneList2.Count, Is.EqualTo(0));