Skip to content

Commit 98c4ce8

Browse files
committed
- 修复 WithTempQuery + Oracle 分页问题;#1519
1 parent 1424649 commit 98c4ce8

File tree

12 files changed

+195
-24
lines changed

12 files changed

+195
-24
lines changed

FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,44 @@ namespace FreeSql.Tests.SqlServer
99
{
1010
public class SqlServerSelectWithTempQueryTest
1111
{
12+
[Fact]
13+
public void Issues1519()
14+
{
15+
var fsql = g.oracle;
16+
17+
var query = fsql.Select<Issues1510T1>()
18+
.FromQuery(fsql.Select<Issues1510T2>().WithTempQuery(e => e))
19+
.InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
20+
.WithTempQuery(t => new
21+
{
22+
t.t1.Id,
23+
t.t1.Name,
24+
T2Id = t.t2.Id,
25+
T2Name = t.t1.Name,
26+
});
27+
var sql = query.ToSql();
28+
Assert.Equal(sql, @"SELECT *
29+
FROM (
30+
SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME""
31+
FROM ""ISSUES1510T1"" a
32+
INNER JOIN (
33+
SELECT a.""ID"", a.""NAME"", a.""T1JOINID""
34+
FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a");
35+
query.ToList();
36+
37+
query.Page(2, 5);
38+
sql = query.ToSql();
39+
Assert.Equal(sql, @"SELECT t.* FROM (SELECT a.*, ROWNUM AS ""__rownum__""
40+
FROM (
41+
SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME""
42+
FROM ""ISSUES1510T1"" a
43+
INNER JOIN (
44+
SELECT a.""ID"", a.""NAME"", a.""T1JOINID""
45+
FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a
46+
WHERE ROWNUM < 11) t WHERE t.""__rownum__"" > 5");
47+
query.ToList();
48+
}
49+
1250
[Fact]
1351
public void Issues1510()
1452
{

FreeSql.Tests/tests.playlist

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<Playlist Version="2.0">
2+
<Rule Name="Includes" Match="Any">
3+
<Rule Match="All">
4+
<Property Name="Solution" />
5+
<Rule Match="Any">
6+
<Rule Match="All">
7+
<Property Name="Project" Value="FreeSql.Tests" />
8+
<Rule Match="Any">
9+
<Property Name="Namespace" Value="FreeSql.ExpressionTree" />
10+
<Property Name="Namespace" Value="FreeSql.InternalTests" />
11+
<Property Name="Namespace" Value="FreeSql.Tests" />
12+
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.MySqlConnectionExtensions" />
13+
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.NpgsqlConnectionExtensions" />
14+
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.OracleConnectionExtensions" />
15+
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.SqlConnectionExtensions" />
16+
<Property Name="Namespace" Value="FreeSql.Tests.AdoNetExtensions.SQLiteConnectionExtensions" />
17+
<Property Name="Namespace" Value="FreeSql.Tests.Dameng" />
18+
<Property Name="Namespace" Value="FreeSql.Tests.DamengExpression" />
19+
<Property Name="Namespace" Value="FreeSql.Tests.DamengMapType" />
20+
<Property Name="Namespace" Value="FreeSql.Tests.DataAnnotations" />
21+
<Property Name="Namespace" Value="FreeSql.Tests.DynamicEntity" />
22+
<Property Name="Namespace" Value="FreeSql.Tests.Extensions" />
23+
<Property Name="Namespace" Value="FreeSql.Tests.Firebird" />
24+
<Property Name="Namespace" Value="FreeSql.Tests.FirebirdExpression" />
25+
<Property Name="Namespace" Value="FreeSql.Tests.FirebirdMapType" />
26+
<Property Name="Namespace" Value="FreeSql.Tests.Internal" />
27+
<Property Name="Namespace" Value="FreeSql.Tests.Issues" />
28+
<Property Name="Namespace" Value="FreeSql.Tests.Linq" />
29+
<Property Name="Namespace" Value="FreeSql.Tests.MsAccess" />
30+
<Property Name="Namespace" Value="FreeSql.Tests.MsAccessExpression" />
31+
<Property Name="Namespace" Value="FreeSql.Tests.MsAccessMapType" />
32+
<Property Name="Namespace" Value="FreeSql.Tests.MySql" />
33+
<Property Name="Namespace" Value="FreeSql.Tests.MySqlExpression" />
34+
<Property Name="Namespace" Value="FreeSql.Tests.MySqlMapType" />
35+
<Property Name="Namespace" Value="FreeSql.Tests.Oracle" />
36+
<Property Name="Namespace" Value="FreeSql.Tests.OracleExpression" />
37+
<Property Name="Namespace" Value="FreeSql.Tests.OracleMapType" />
38+
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQL" />
39+
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQL.PgArrayToMany" />
40+
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQLExpression" />
41+
<Property Name="Namespace" Value="FreeSql.Tests.PostgreSQLMapType" />
42+
<Property Name="Namespace" Value="FreeSql.Tests.Properties" />
43+
<Property Name="Namespace" Value="FreeSql.Tests.Sqlite" />
44+
<Property Name="Namespace" Value="FreeSql.Tests.SqliteExpression" />
45+
<Property Name="Namespace" Value="FreeSql.Tests.SqliteMapType" />
46+
<Property Name="Namespace" Value="FreeSql.Tests.SqlServer" />
47+
<Property Name="Namespace" Value="FreeSql.Tests.SqlServerExpression" />
48+
<Property Name="Namespace" Value="FreeSql.Tests.SqlServerMapType" />
49+
</Rule>
50+
</Rule>
51+
<Property Name="Project" Value="FreeSql.Tests.DbContext" />
52+
<Property Name="Project" Value="FreeSql.Tests.PerformanceTests" />
53+
<Property Name="Project" Value="FreeSql.Tests.Provider.Custom" />
54+
<Property Name="Project" Value="FreeSql.Tests.Provider.MySqlConnector (net6.0)" />
55+
<Property Name="Project" Value="FreeSql.Tests.Provider.MySqlConnector (netcoreapp3.1)" />
56+
<Rule Match="All">
57+
<Property Name="Project" Value="FreeSql.Tests.Provider.Odbc" />
58+
<Rule Match="Any">
59+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc" />
60+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Dameng" />
61+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DamengExpression" />
62+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DamengMapType" />
63+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Default" />
64+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DefaultExpression" />
65+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.DefaultMapType" />
66+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySql" />
67+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySqlExpression" />
68+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.MySqlMapType" />
69+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.Oracle" />
70+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.OracleExpression" />
71+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.OracleMapType" />
72+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQL" />
73+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQLExpression" />
74+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.PostgreSQLMapType" />
75+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServer" />
76+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServerExpression" />
77+
<Property Name="Namespace" Value="FreeSql.Tests.Odbc.SqlServerMapType" />
78+
</Rule>
79+
</Rule>
80+
<Property Name="Project" Value="FreeSql.Tests.Provider.OracleOledb (net6.0)" />
81+
<Property Name="Project" Value="FreeSql.Tests.Provider.OracleOledb (netcoreapp3.1)" />
82+
<Property Name="Project" Value="FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite" />
83+
<Property Name="Project" Value="FreeSql.Tests.Provider.Sqlite.Data" />
84+
<Property Name="Project" Value="FreeSql.Tests.VB" />
85+
</Rule>
86+
</Rule>
87+
</Rule>
88+
</Playlist>

FreeSql/Extensions/FreeSqlGlobalExpressionCallExtensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ public static bool LessThanOrEqual<TValue>(TValue value1, TValue value2)
188188
expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} <= {expContext.Value.ParsedContent["value2"]}";
189189
return false;
190190
}
191+
/// <summary>
192+
/// value1 IS NULL
193+
/// </summary>
194+
/// <typeparam name="TValue"></typeparam>
195+
/// <param name="value1"></param>
196+
/// <returns></returns>
197+
public static bool EqualIsNull<TValue>(TValue value1)
198+
{
199+
expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} IS NULL";
200+
return false;
201+
}
191202
#endregion
192203

193204
/// <summary>

FreeSql/FreeSql.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,15 @@ internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _c
3232

3333
sbunion.Append(_select);
3434
if (_distinct) sbunion.Append("DISTINCT ");
35-
sbunion.Append(field);
36-
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
37-
sbunion.Append(" \r\nFROM ");
3835
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
3936
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
37+
38+
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
39+
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
40+
sbunion.Append(field);
41+
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
42+
sbunion.Append(" \r\nFROM ");
43+
4044
for (var a = 0; a < tbsfrom.Length; a++)
4145
{
4246
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, CommonExpr
4141
if (_distinct) sb.Append("DISTINCT ");
4242
//if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题
4343
if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" ");
44-
sb.Append(field);
44+
var rownum = "";
4545

4646
if (_limit > 0 || _skip > 0)
4747
{
@@ -57,11 +57,14 @@ internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, CommonExpr
5757
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
5858
}
5959
if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP
60-
sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__");
60+
rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__";
6161
}
62-
sb.Append(" \r\nFROM ");
6362
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
6463
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
64+
if (string.IsNullOrEmpty(rownum) == false && field == "*")
65+
sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
66+
sb.Append(field).Append(rownum);
67+
sb.Append(" \r\nFROM ");
6568
for (var a = 0; a < tbsfrom.Length; a++)
6669
{
6770
var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule);

Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@ internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _c
3232

3333
sbunion.Append(_select);
3434
if (_distinct) sbunion.Append("DISTINCT ");
35-
sbunion.Append(field);
36-
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
37-
sbunion.Append(" \r\nFROM ");
3835
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
3936
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
37+
38+
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
39+
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
40+
sbunion.Append(field);
41+
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
42+
sbunion.Append(" \r\nFROM ");
4043
for (var a = 0; a < tbsfrom.Length; a++)
4144
{
4245
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@ internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _c
3232

3333
sbunion.Append(_select);
3434
if (_distinct) sbunion.Append("DISTINCT ");
35-
sbunion.Append(field);
36-
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
37-
sbunion.Append(" \r\nFROM ");
3835
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
3936
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
37+
38+
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
39+
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
40+
sbunion.Append(field);
41+
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
42+
sbunion.Append(" \r\nFROM ");
4043
for (var a = 0; a < tbsfrom.Length; a++)
4144
{
4245
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@ internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _c
3232

3333
sbunion.Append(_select);
3434
if (_distinct) sbunion.Append("DISTINCT ");
35-
sbunion.Append(field);
36-
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
37-
sbunion.Append(" \r\nFROM ");
3835
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
3936
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
37+
38+
var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0;
39+
if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
40+
sbunion.Append(field);
41+
if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\"");
42+
sbunion.Append(" \r\nFROM ");
4043
for (var a = 0; a < tbsfrom.Length; a++)
4144
{
4245
sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);

Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, CommonExpr
4141
if (_distinct) sb.Append("DISTINCT ");
4242
//if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题
4343
if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" ");
44-
sb.Append(field);
44+
var rownum = "";
4545

4646
if (_limit > 0 || _skip > 0)
4747
{
@@ -57,11 +57,14 @@ internal static string ToSqlStaticRowNumber(CommonUtils _commonUtils, CommonExpr
5757
_orderby = _groupby.Replace("GROUP BY ", "ORDER BY ");
5858
}
5959
if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP
60-
sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__");
60+
rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__";
6161
}
62-
sb.Append(" \r\nFROM ");
6362
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
6463
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
64+
if (string.IsNullOrEmpty(rownum) == false && field == "*")
65+
sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug
66+
sb.Append(field).Append(rownum);
67+
sb.Append(" \r\nFROM ");
6568
for (var a = 0; a < tbsfrom.Length; a++)
6669
{
6770
var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule);

0 commit comments

Comments
 (0)