From 3003b6592ed632b03b4e5eeea5830434ebe7a1e6 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 9 Mar 2023 16:50:23 +0700 Subject: [PATCH 1/2] Error on empty Over clause for MS SQL and SQLite --- tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs | 3 +++ tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs index 5e05bcc..590c54e 100644 --- a/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs @@ -14,6 +14,9 @@ public RankTests(ITestOutputHelper output) [Fact] public void RowNumberBasic() => rankTests.RowNumberBasic(); + [Fact] + public void RowNumberEmptyOver() => rankTests.RowNumberEmptyOver(); + [Fact] public void RankBasic() => rankTests.RankBasic(); diff --git a/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs index aa5dc88..417cc7a 100644 --- a/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs @@ -14,6 +14,9 @@ public RankTests(ITestOutputHelper output) [Fact] public void RowNumberBasic() => rankTests.RowNumberBasic(); + [Fact] + public void RowNumberEmptyOver() => rankTests.RowNumberEmptyOver(); + [Fact] public void RankBasic() => rankTests.RankBasic(); From 3763ce00cb135064f8802647418b1112ea714b24 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 9 Mar 2023 21:27:07 +0700 Subject: [PATCH 2/2] add tests --- .../RankTests.cs | 9 ++++ .../RankTests.cs | 11 +++- .../RankTests.cs | 11 +++- .../RankTests.cs | 50 +++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/tests/Zomp.EFCore.WindowFunctions.Npgsql.Tests/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.Npgsql.Tests/RankTests.cs index b4f3873..6866db5 100644 --- a/tests/Zomp.EFCore.WindowFunctions.Npgsql.Tests/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.Npgsql.Tests/RankTests.cs @@ -20,9 +20,18 @@ public RankTests(ITestOutputHelper output) [Fact] public void RankBasic() => rankTests.RankBasic(); + [Fact] + public void RankEmptyOver() => rankTests.RankEmptyOver(); + [Fact] public void DenseRankBasic() => rankTests.DenseRankBasic(); + [Fact] + public void DenseRankEmptyOver() => rankTests.DenseRankEmptyOver(); + [Fact] public void PercentRankBasic() => rankTests.PercentRankBasic(true); + + [Fact] + public void PercentRankEmptyOver() => rankTests.PercentRankEmptyOver(true); } \ No newline at end of file diff --git a/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs index 590c54e..c198bd7 100644 --- a/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.SqlServer.Tests/RankTests.cs @@ -20,9 +20,18 @@ public RankTests(ITestOutputHelper output) [Fact] public void RankBasic() => rankTests.RankBasic(); + [Fact] + public void RankEmptyOver() => rankTests.RankEmptyOver(); + [Fact] public void DenseRankBasic() => rankTests.DenseRankBasic(); [Fact] - public void PercentRankBasic() => rankTests.PercentRankBasic(); + public void DenseRankEmptyOver() => rankTests.DenseRankEmptyOver(); + + [Fact] + public void PercentRankBasic() => rankTests.PercentRankBasic(true); + + [Fact] + public void PercentRankEmptyOver() => rankTests.PercentRankEmptyOver(true); } \ No newline at end of file diff --git a/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs index 417cc7a..498ded9 100644 --- a/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.Sqlite.Tests/RankTests.cs @@ -20,9 +20,18 @@ public RankTests(ITestOutputHelper output) [Fact] public void RankBasic() => rankTests.RankBasic(); + [Fact] + public void RankEmptyOver() => rankTests.RankEmptyOver(); + [Fact] public void DenseRankBasic() => rankTests.DenseRankBasic(); [Fact] - public void PercentRankBasic() => rankTests.PercentRankBasic(); + public void DenseRankEmptyOver() => rankTests.DenseRankEmptyOver(); + + [Fact] + public void PercentRankBasic() => rankTests.PercentRankBasic(true); + + [Fact] + public void PercentRankEmptyOver() => rankTests.PercentRankEmptyOver(true); } \ No newline at end of file diff --git a/tests/Zomp.EFCore.WindowFunctions.Testing/RankTests.cs b/tests/Zomp.EFCore.WindowFunctions.Testing/RankTests.cs index 49890e9..9d34841 100644 --- a/tests/Zomp.EFCore.WindowFunctions.Testing/RankTests.cs +++ b/tests/Zomp.EFCore.WindowFunctions.Testing/RankTests.cs @@ -63,6 +63,23 @@ public void RankBasic() Assert.Equal(expectedSequence, result.Select(r => r.Rank)); } + public void RankEmptyOver() + { + var query = dbContext.TestRows + .Select(r => new + { + Rank = EF.Functions.Rank(EF.Functions.Over()), + }); + + var result = query.ToList(); + + var expectedSequence = TestFixture.TestRows + .Select((r, i) => 1L) + .ToList(); + + Assert.Equal(expectedSequence, result.Select(r => r.Rank)); + } + public void DenseRankBasic() { var query = dbContext.TestRows @@ -80,6 +97,22 @@ public void DenseRankBasic() Assert.Equal(expectedSequence, result.Select(r => r.DenseRank)); } + public void DenseRankEmptyOver() + { + var query = dbContext.TestRows + .Select(r => new + { + DenseRank = EF.Functions.DenseRank(EF.Functions.Over()), + }); + + var result = query.ToList(); + + var expectedSequence = TestFixture.TestRows + .Select((r, i) => 1L); + + Assert.Equal(expectedSequence, result.Select(r => r.DenseRank)); + } + public void PercentRankBasic(bool nullsLast = false) { var query = dbContext.TestRows @@ -104,4 +137,21 @@ public void PercentRankBasic(bool nullsLast = false) Assert.Equal(expectedSequence, result.Select(r => r.PercentRank)); } + + public void PercentRankEmptyOver(bool nullsLast = false) + { + var query = dbContext.TestRows + .Select(r => new + { + PercentRank = EF.Functions.PercentRank(EF.Functions.Over()), + }); + + var result = query.ToList(); + + var expectedSequence = TestFixture.TestRows + .Select(r => 0d) + .ToList(); + + Assert.Equal(expectedSequence, result.Select(r => r.PercentRank)); + } } \ No newline at end of file