From 40f9db851b40f91d6f2593ec8759fa3777e984d3 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 25 Mar 2023 08:49:20 +0200 Subject: [PATCH 1/3] Test case --- src/NHibernate.Test/Hql/EntityJoinHqlTest.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs index 607e1e80cb8..a07ec58379a 100644 --- a/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Hql/EntityJoinHqlTest.cs @@ -346,6 +346,15 @@ from x2 in session.Query() //GH-2988 var withNullOrValidList = session.Query().Where(x => x.ManyToOne.Id == validManyToOne.Id || x.ManyToOne == null).ToList(); var withNullOrValidList2 = session.Query().Where(x => x.ManyToOne == null || x.ManyToOne.Id == validManyToOne.Id).ToList(); + //GH-3269 + var invalidId = Guid.NewGuid(); + var withInvalidOrValid = session.Query().Where(x => x.OneToOne.Id == invalidId || x.ManyToOne.Id == validManyToOne.Id).ToList(); + var withInvalidOrNull = session.Query().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne == null).ToList(); + var withInvalidOrNotNull = session.Query().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne != null).ToList(); + + Assert.That(withInvalidOrValid.Count, Is.EqualTo(1)); + Assert.That(withInvalidOrNull.Count, Is.EqualTo(2)); + Assert.That(withInvalidOrNotNull.Count, Is.EqualTo(0)); //GH-3185 var mixImplicitAndLeftJoinList = session.Query().Where(x => x.ManyToOne.Id == validManyToOne.Id && x.OneToOne == null).ToList(); From ccf254dfd78fcd674e63c46ac846e8e28190db2f Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 25 Mar 2023 09:28:11 +0200 Subject: [PATCH 2/3] Fix --- src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs | 3 --- src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.g | 2 +- src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs index c93384c1344..76325152051 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs @@ -42,7 +42,6 @@ public partial class HqlSqlWalker private SelectClause _selectClause; private readonly AliasGenerator _aliasGenerator = new AliasGenerator(); private readonly ASTPrinter _printer = new ASTPrinter(); - private bool _isNullComparison; // //Maps each top-level result variable to its SelectExpression; @@ -1209,8 +1208,6 @@ public IASTFactory ASTFactory } } - internal bool IsNullComparison => _isNullComparison; - public void AddQuerySpaces(string[] spaces) { for (int i = 0; i < spaces.Length; i++) diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.g b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.g index d99340b9726..fba1010337c 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.g +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.g @@ -380,7 +380,7 @@ comparisonExpr | ^(NOT_BETWEEN exprOrSubquery exprOrSubquery exprOrSubquery) | ^(IN exprOrSubquery inRhs ) | ^(NOT_IN exprOrSubquery inRhs ) - | ^(IS_NULL { _isNullComparison = true; } exprOrSubquery { _isNullComparison = false; }) + | ^(IS_NULL exprOrSubquery) | ^(IS_NOT_NULL exprOrSubquery) // | ^(IS_TRUE expr) // | ^(IS_FALSE expr) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs index 5c41ca001c4..f7743426826 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs @@ -417,8 +417,7 @@ private void DereferenceEntity(EntityType entityType, bool implicitJoin, string if ( joinIsNeeded ) { - var forceLeftJoin = comparisonWithNullableEntity && Walker.IsNullComparison; - DereferenceEntityJoin(classAlias, entityType, implicitJoin, parent, forceLeftJoin); + DereferenceEntityJoin(classAlias, entityType, implicitJoin, parent, comparisonWithNullableEntity); if (comparisonWithNullableEntity) { _columns = FromElement.GetIdentityColumns(); From 8e18b5c7977ae41bfa41bad6161aacd69d1aee39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 25 Mar 2023 07:31:12 +0000 Subject: [PATCH 3/3] Generate async files --- src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs index 65d0459ef3d..54b07fa8b96 100644 --- a/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs +++ b/src/NHibernate.Test/Async/Hql/EntityJoinHqlTest.cs @@ -358,6 +358,15 @@ from x2 in session.Query() //GH-2988 var withNullOrValidList = await (session.Query().Where(x => x.ManyToOne.Id == validManyToOne.Id || x.ManyToOne == null).ToListAsync()); var withNullOrValidList2 = await (session.Query().Where(x => x.ManyToOne == null || x.ManyToOne.Id == validManyToOne.Id).ToListAsync()); + //GH-3269 + var invalidId = Guid.NewGuid(); + var withInvalidOrValid = await (session.Query().Where(x => x.OneToOne.Id == invalidId || x.ManyToOne.Id == validManyToOne.Id).ToListAsync()); + var withInvalidOrNull = await (session.Query().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne == null).ToListAsync()); + var withInvalidOrNotNull = await (session.Query().Where(x => x.ManyToOne.Id == invalidId || x.OneToOne != null).ToListAsync()); + + Assert.That(withInvalidOrValid.Count, Is.EqualTo(1)); + Assert.That(withInvalidOrNull.Count, Is.EqualTo(2)); + Assert.That(withInvalidOrNotNull.Count, Is.EqualTo(0)); //GH-3185 var mixImplicitAndLeftJoinList = await (session.Query().Where(x => x.ManyToOne.Id == validManyToOne.Id && x.OneToOne == null).ToListAsync());