fix: keep existing SQL Server TOP clauses

This commit is contained in:
t8y2 2026-05-25 16:51:18 +08:00
parent 9f6c35ee78
commit 0354fe7050
2 changed files with 22 additions and 0 deletions

View File

@ -321,6 +321,9 @@ fn has_top_level_select_into(sql: &str) -> bool {
}
fn add_sql_server_top(sql: &str, limit: usize) -> String {
if has_top_level_select_top(sql) {
return sql.to_string();
}
if sql.len() >= 6 && sql[..6].to_ascii_uppercase() == "SELECT" {
format!("SELECT TOP ({limit}){}", &sql[6..])
} else {
@ -588,6 +591,19 @@ mod tests {
assert_eq!(result.sql.unwrap(), "SELECT TOP (100) COUNT(*) FROM TicketInfo");
}
#[test]
fn keeps_existing_sqlserver_top_clause() {
let result = build_paginated_query_sql(PaginatedQuerySqlOptions {
original_sql: "SELECT TOP 1000 * FROM TicketInfo".to_string(),
database_type: Some(DatabaseType::SqlServer),
limit: 100,
offset: 0,
});
assert_eq!(result.ok, true);
assert_eq!(result.sql.unwrap(), "SELECT TOP 1000 * FROM TicketInfo");
}
#[test]
fn wraps_sqlserver_select_with_unnamed_column() {
let result = build_paginated_query_sql(PaginatedQuerySqlOptions {

View File

@ -43,3 +43,9 @@ test("Rust backends register query result SQL builders", () => {
assert.match(webMainSource, /\/query\/prepare-pagination-plan/);
assert.match(webMainSource, /\/query\/build-sorted-sql/);
});
test("SQL Server pagination keeps user-provided TOP clauses", () => {
assert.match(rustQueryResultSqlSource, /fn add_sql_server_top/);
assert.match(rustQueryResultSqlSource, /if has_top_level_select_top\(sql\)/);
assert.match(rustQueryResultSqlSource, /SELECT TOP 1000 \* FROM TicketInfo/);
});