diff --git a/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs b/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs index 18d52314a31..eb285f5b3ce 100644 --- a/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs +++ b/src/NHibernate.Test/Async/Hql/Ast/HqlFixture.cs @@ -306,5 +306,14 @@ public async Task UnaryMinusBeforeParenthesesHandledCorrectlyAsync() Assert.That(actualWorkaround, Is.EqualTo(-2)); } } + + //NH-3249 (GH-1285) + [Test] + public async Task CountDistinctOnFunctionAsync() + { + var hql = @"SELECT COUNT(DISTINCT DATE(m.birthdate)) FROM Mammal m"; + using(var s = OpenSession()) + await (s.CreateQuery(hql).ListAsync()); + } } } diff --git a/src/NHibernate.Test/Async/Linq/ByMethod/CountTests.cs b/src/NHibernate.Test/Async/Linq/ByMethod/CountTests.cs index 5581badf6c8..2120bd127ad 100644 --- a/src/NHibernate.Test/Async/Linq/ByMethod/CountTests.cs +++ b/src/NHibernate.Test/Async/Linq/ByMethod/CountTests.cs @@ -40,6 +40,21 @@ public async Task CountDistinctProperty_ReturnsNumberOfDistinctEntriesForThatPro Assert.That(result, Is.EqualTo(387)); } + //NH-3249 (GH-1285) + [Test] + public async Task CountDistinctFunc_ReturnsNumberOfDistinctEntriesForThatFuncAsync() + { + if (!TestDialect.SupportsCountDistinct) + Assert.Ignore("Dialect does not support count distinct"); + + var result = await (db.Orders + .Select(x => x.ShippingDate.Value.Date) + .Distinct() + .CountAsync()); + + Assert.That(result, Is.EqualTo(387)); + } + [Test] public async Task CountProperty_ReturnsNumberOfNonNullEntriesForThatPropertyAsync() { diff --git a/src/NHibernate.Test/Hql/Ast/HqlFixture.cs b/src/NHibernate.Test/Hql/Ast/HqlFixture.cs index 8bcebdd2855..6b3175242d2 100644 --- a/src/NHibernate.Test/Hql/Ast/HqlFixture.cs +++ b/src/NHibernate.Test/Hql/Ast/HqlFixture.cs @@ -337,5 +337,14 @@ public void UnaryMinusBeforeParenthesesHandledCorrectly() Assert.That(actualWorkaround, Is.EqualTo(-2)); } } + + //NH-3249 (GH-1285) + [Test] + public void CountDistinctOnFunction() + { + var hql = @"SELECT COUNT(DISTINCT DATE(m.birthdate)) FROM Mammal m"; + using(var s = OpenSession()) + s.CreateQuery(hql).List(); + } } } diff --git a/src/NHibernate.Test/Linq/ByMethod/CountTests.cs b/src/NHibernate.Test/Linq/ByMethod/CountTests.cs index 7ef2d7dbbe6..e1ced74bd04 100644 --- a/src/NHibernate.Test/Linq/ByMethod/CountTests.cs +++ b/src/NHibernate.Test/Linq/ByMethod/CountTests.cs @@ -28,6 +28,21 @@ public void CountDistinctProperty_ReturnsNumberOfDistinctEntriesForThatProperty( Assert.That(result, Is.EqualTo(387)); } + //NH-3249 (GH-1285) + [Test] + public void CountDistinctFunc_ReturnsNumberOfDistinctEntriesForThatFunc() + { + if (!TestDialect.SupportsCountDistinct) + Assert.Ignore("Dialect does not support count distinct"); + + var result = db.Orders + .Select(x => x.ShippingDate.Value.Date) + .Distinct() + .Count(); + + Assert.That(result, Is.EqualTo(387)); + } + [Test] public void CountProperty_ReturnsNumberOfNonNullEntriesForThatProperty() { diff --git a/src/NHibernate/Hql/Ast/ANTLR/Hql.g b/src/NHibernate/Hql/Ast/ANTLR/Hql.g index efe660d8918..f074f6e44d9 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Hql.g +++ b/src/NHibernate/Hql/Ast/ANTLR/Hql.g @@ -627,9 +627,14 @@ aggregateArgument ; aggregateDistinctAll - : ( ( DISTINCT | ALL )? ( path | collectionExpr ) ) + : ( distinctAll aggregateArgument ) => (distinctAll aggregateArgument) + | aggregateArgument ; - + +distinctAll + : ( DISTINCT | ALL ) + ; + //## collection: ( OPEN query CLOSE ) | ( 'elements'|'indices' OPEN path CLOSE ); collectionExpr