From 4faa814e8f405333e1c83543bc80a594d329e91b Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 14 Jan 2022 16:11:57 +0200 Subject: [PATCH 1/9] Disable implicit join generation for implied entity joins --- .../Async/NHSpecificTest/NH1444/Fixture.cs | 6 +++--- .../NHSpecificTest/NH1444/Fixture.cs | 6 +++--- .../Ast/ANTLR/SessionFactoryHelperExtensions.cs | 2 +- src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs | 2 +- .../Hql/Ast/ANTLR/Tree/FromElementFactory.cs | 16 ++++++++++++---- src/NHibernate/Hql/CollectionSubqueryFactory.cs | 2 +- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1444/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1444/Fixture.cs index d26b0dcf6d5..f98f6614a2a 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1444/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1444/Fixture.cs @@ -37,9 +37,9 @@ public async Task BugAsync() var message = ls.GetWholeLog(); var paramFormatter = (ISqlParameterFormatter)Sfi.ConnectionProvider.Driver; Assert.That(message, Does.Contain( - "xchild0_.ParentId=xparent1_.Id and (" + - $"{paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " + - $"xparent1_.A<{paramFormatter.GetParameterName(1)})")); + "on xchild0_.ParentId=xparent1_.Id").And.Contain( + $"where {paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " + + $"xparent1_.A<{paramFormatter.GetParameterName(1)};")); } } } diff --git a/src/NHibernate.Test/NHSpecificTest/NH1444/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1444/Fixture.cs index c9ed741db25..a6413ef538a 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1444/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1444/Fixture.cs @@ -26,9 +26,9 @@ public void Bug() var message = ls.GetWholeLog(); var paramFormatter = (ISqlParameterFormatter)Sfi.ConnectionProvider.Driver; Assert.That(message, Does.Contain( - "xchild0_.ParentId=xparent1_.Id and (" + - $"{paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " + - $"xparent1_.A<{paramFormatter.GetParameterName(1)})")); + "on xchild0_.ParentId=xparent1_.Id").And.Contain( + $"where {paramFormatter.GetParameterName(0)}={Dialect.ToBooleanValueString(true)} or " + + $"xparent1_.A<{paramFormatter.GetParameterName(1)};")); } } } diff --git a/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs b/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs index 33d6103ec86..fccfa0b02de 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs @@ -319,7 +319,7 @@ public JoinSequence CreateCollectionJoinSequence(IQueryableCollection collPersis { JoinSequence joinSequence = CreateJoinSequence(); joinSequence.SetRoot(collPersister, collectionName); - joinSequence.SetUseThetaStyle(true); // TODO: figure out how this should be set. + joinSequence.SetUseThetaStyle(false); // TODO: figure out how this should be set. /////////////////////////////////////////////////////////////////////////////// // This was the reason for failures regarding INDEX_OP and subclass joins on diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs index ce379c564a9..c7ed90249d4 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs @@ -519,7 +519,7 @@ private void DereferenceEntityJoin(string classAlias, EntityType propertyType, b // If this is an implied join in a from element, then use the impled join type which is part of the // tree parser's state (set by the gramamar actions). JoinSequence joinSequence = SessionFactoryHelper - .CreateJoinSequence( impliedJoin, propertyType, tableAlias, _joinType, joinColumns ); + .CreateJoinSequence(false, propertyType, tableAlias, _joinType, joinColumns); var factory = new FromElementFactory( currentFromClause, diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs index 1324ffe7e7a..f277be4f5ed 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementFactory.cs @@ -122,6 +122,10 @@ private FromElement CreateFromElementInSubselect( string tableAlias = correlatedSubselect ? fromElement.TableAlias : null; + //To properly generete subselect implicit join is required by SqlGenerator + if (fromElement.IsImplied) + fromElement.JoinSequence.SetUseThetaStyle(true); + // If the from element isn't in the same clause, create a new from element. if (fromElement.FromClause != _fromClause) { @@ -190,17 +194,20 @@ public FromElement CreateCollection(IQueryableCollection queryableCollection, { // A collection of entities... elem = CreateEntityAssociation(role, roleAlias, joinType); + //TODO: Investigate why not implicit indexed join is incorrectly generated and get rid of it + if (indexed && elem.IsImplied) + elem.JoinSequence.SetUseThetaStyle(true); } else if (elementType.IsComponentType) { // A collection of components... - JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType); + JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType, indexed); elem = CreateCollectionJoin(joinSequence, roleAlias); } else { // A collection of scalar elements... - JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType); + JoinSequence joinSequence = CreateJoinSequence(roleAlias, joinType, indexed); elem = CreateCollectionJoin(joinSequence, roleAlias); } @@ -429,7 +436,8 @@ private FromElement CreateManyToMany( return elem; } - private JoinSequence CreateJoinSequence(string roleAlias, JoinType joinType) + //TODO: Investigate why not implicit indexed join is incorrectly generated and get rid of implicitJoin parameter + private JoinSequence CreateJoinSequence(string roleAlias, JoinType joinType, bool implicitJoin = false) { SessionFactoryHelperExtensions sessionFactoryHelper = _fromClause.SessionFactoryHelper; string[] joinColumns = Columns; @@ -437,7 +445,7 @@ private JoinSequence CreateJoinSequence(string roleAlias, JoinType joinType) { throw new InvalidOperationException("collectionType is null!"); } - return sessionFactoryHelper.CreateJoinSequence(_implied, _collectionType, roleAlias, joinType, joinColumns); + return sessionFactoryHelper.CreateJoinSequence(implicitJoin, _collectionType, roleAlias, joinType, joinColumns); } private FromElement CreateJoin( diff --git a/src/NHibernate/Hql/CollectionSubqueryFactory.cs b/src/NHibernate/Hql/CollectionSubqueryFactory.cs index 0e95d09ecb9..ae824150b67 100644 --- a/src/NHibernate/Hql/CollectionSubqueryFactory.cs +++ b/src/NHibernate/Hql/CollectionSubqueryFactory.cs @@ -3,7 +3,6 @@ using System.Text; using NHibernate.Engine; using NHibernate.SqlCommand; -using NHibernate.Util; namespace NHibernate.Hql { @@ -16,6 +15,7 @@ public static string CreateCollectionSubquery( { try { + joinSequence.SetUseThetaStyle(true); JoinFragment join = joinSequence.ToJoinFragment(enabledFilters, true); return new StringBuilder() .Append("select ") From 32fdfec3d9dbdc8221979304caf1d89454356dda Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 15 Jan 2022 12:36:46 +0200 Subject: [PATCH 2/9] Fix questionable subquery case --- src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs index 836344eb5fa..d69cb3fcd8d 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs @@ -759,7 +759,12 @@ void CreateFromJoinElement( if (fromElement.Parent == null) { + // Most likely means association join is used in invalid context + // I.e. in subquery: from EntityA a where exists (from EntityB join a.Assocation) + // Maybe we should throw exception instead fromElement.FromClause.AddChild(fromElement); + if (fromElement.IsImplied) + fromElement.JoinSequence.SetUseThetaStyle(true); } } From 87fe78d73271e96bc699609184f9d231978acaac Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sat, 15 Jan 2022 12:38:11 +0200 Subject: [PATCH 3/9] Remove no op call --- src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs b/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs index fccfa0b02de..097d51e3181 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/SessionFactoryHelperExtensions.cs @@ -319,7 +319,6 @@ public JoinSequence CreateCollectionJoinSequence(IQueryableCollection collPersis { JoinSequence joinSequence = CreateJoinSequence(); joinSequence.SetRoot(collPersister, collectionName); - joinSequence.SetUseThetaStyle(false); // TODO: figure out how this should be set. /////////////////////////////////////////////////////////////////////////////// // This was the reason for failures regarding INDEX_OP and subclass joins on From 4b28ec06928df1b792b3b5ad83e3ad96ecd14e7f Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Sun, 16 Jan 2022 14:02:11 +0200 Subject: [PATCH 4/9] Add implied joins right to origin table (to avoid breakage by implicit joins) --- src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs index 340eb5f7de9..68bebd9aa85 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElement.cs @@ -590,13 +590,13 @@ public void SetOrigin(FromElement origin, bool manyToMany) } else { - if (!Walker.IsInFrom && !Walker.IsInSelect) + if (this.IsImplied || Walker.IsInFrom || Walker.IsInSelect) { - FromClause.AddChild(this); + origin.AddChild(this); } else { - origin.AddChild(this); + FromClause.AddChild(this); } } } From e09d29fad51cab8f719b3ab724157ae53c33df0d Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Mon, 17 Jan 2022 10:23:20 +0200 Subject: [PATCH 5/9] Restore old behavior for implicit join --- src/NHibernate.DomainModel/Container.cs | 7 ++++++ src/NHibernate.DomainModel/Container.hbm.xml | 2 +- .../Async/Legacy/ParentChildTest.cs | 11 ++++++--- src/NHibernate.Test/Legacy/ParentChildTest.cs | 11 ++++++--- .../Hql/Ast/ANTLR/Tree/FromElement.cs | 2 +- .../Hql/Ast/ANTLR/Tree/FromElementFactory.cs | 23 +++++++++---------- 6 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/NHibernate.DomainModel/Container.cs b/src/NHibernate.DomainModel/Container.cs index c1ead671661..6acf84f30a2 100644 --- a/src/NHibernate.DomainModel/Container.cs +++ b/src/NHibernate.DomainModel/Container.cs @@ -92,6 +92,7 @@ public Glarch Glarch private IDictionary _ternaryMap; // mapping private ISet _ternarySet; + private One _one; public virtual IList OneToMany { @@ -129,6 +130,12 @@ public virtual long Id set { _id = value; } } + public virtual One One + { + get => _one; + set => _one = value; + } + public virtual IList Bag { get { return _bag; } diff --git a/src/NHibernate.DomainModel/Container.hbm.xml b/src/NHibernate.DomainModel/Container.hbm.xml index 587fe759bc3..3e3d2ec19ef 100644 --- a/src/NHibernate.DomainModel/Container.hbm.xml +++ b/src/NHibernate.DomainModel/Container.hbm.xml @@ -22,7 +22,7 @@ > - + Date: Mon, 17 Jan 2022 10:34:00 +0200 Subject: [PATCH 6/9] Use 9.0 LangVersion as 10.0 causes some compile issues --- build-common/NHibernate.props | 1 + src/NHibernate/NHibernate.csproj | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build-common/NHibernate.props b/build-common/NHibernate.props index be1846b0d37..f3b14a03465 100644 --- a/build-common/NHibernate.props +++ b/build-common/NHibernate.props @@ -6,6 +6,7 @@ 0 dev + 9.0 $(NhVersion).$(VersionPatch) $(VersionSuffix).$(BuildNumber) diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj index c4e0065a429..b596930f801 100644 --- a/src/NHibernate/NHibernate.csproj +++ b/src/NHibernate/NHibernate.csproj @@ -12,7 +12,6 @@ NHibernate is a mature, open source object-relational mapper for the .NET framework. It is actively developed, fully featured and used in thousands of successful projects. ORM; O/RM; DataBase; DAL; ObjectRelationalMapping; NHibernate; ADO.Net; Core - 7.3 From 4acb76ee6ee877ead339628fad689371f6d9472c Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Mon, 17 Jan 2022 13:38:08 +0200 Subject: [PATCH 7/9] Another attempt to fix test --- src/NHibernate.DomainModel/Container.cs | 8 ++++---- src/NHibernate.DomainModel/Container.hbm.xml | 2 +- src/NHibernate.Test/Async/Legacy/ParentChildTest.cs | 8 ++++---- src/NHibernate.Test/Legacy/ParentChildTest.cs | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/NHibernate.DomainModel/Container.cs b/src/NHibernate.DomainModel/Container.cs index 6acf84f30a2..911bfa5fd9e 100644 --- a/src/NHibernate.DomainModel/Container.cs +++ b/src/NHibernate.DomainModel/Container.cs @@ -92,7 +92,7 @@ public Glarch Glarch private IDictionary _ternaryMap; // mapping private ISet _ternarySet; - private One _one; + private Simple _manyToOne; public virtual IList OneToMany { @@ -130,10 +130,10 @@ public virtual long Id set { _id = value; } } - public virtual One One + public virtual Simple ManyToOne { - get => _one; - set => _one = value; + get => _manyToOne; + set => _manyToOne = value; } public virtual IList Bag diff --git a/src/NHibernate.DomainModel/Container.hbm.xml b/src/NHibernate.DomainModel/Container.hbm.xml index 3e3d2ec19ef..7fa90eb59de 100644 --- a/src/NHibernate.DomainModel/Container.hbm.xml +++ b/src/NHibernate.DomainModel/Container.hbm.xml @@ -22,7 +22,7 @@ > - + Date: Sun, 8 May 2022 19:33:55 +0200 Subject: [PATCH 8/9] Remove obsolete comment --- src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs index e8372f4bb04..d930c0f5f3c 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/DotNode.cs @@ -516,8 +516,6 @@ private void DereferenceEntityJoin(string classAlias, EntityType propertyType, b if ( ! useFoundFromElement ) { - // If this is an implied join in a from element, then use the impled join type which is part of the - // tree parser's state (set by the gramamar actions). JoinSequence joinSequence = SessionFactoryHelper .CreateJoinSequence(false, propertyType, tableAlias, _joinType, joinColumns); From 16cc9f20a08fb016bc6b30b30b9eda4d2057ef96 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Wed, 20 Jul 2022 22:40:44 +0000 Subject: [PATCH 9/9] SslMode=none for mysql --- .github/workflows/NetCoreTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/NetCoreTests.yml b/.github/workflows/NetCoreTests.yml index d124512d0d6..f357704e28f 100644 --- a/.github/workflows/NetCoreTests.yml +++ b/.github/workflows/NetCoreTests.yml @@ -15,7 +15,7 @@ jobs: - DB: Firebird CONNECTION_STRING: "DataSource=localhost;Database=nhibernate;User=SYSDBA;Password=nhibernate;charset=utf8;" - DB: MySQL - CONNECTION_STRING: "Server=localhost;Uid=root;Password=nhibernate;Database=nhibernate;Old Guids=True;" + CONNECTION_STRING: "Server=localhost;Uid=root;Password=nhibernate;Database=nhibernate;Old Guids=True;SslMode=none;" - DB: Oracle CONNECTION_STRING: "User ID=nhibernate;Password=nhibernate;Metadata Pooling=false;Self Tuning=false;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1)))" - DB: SQLite