Browse Source

修复SQLServer2005分页处理空格错误.

https://github.com/baomidou/mybatis-plus/issues/6103
nieqiurong 1 year ago
parent
commit
54607462ad

+ 5 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLServer2005Dialect.java

@@ -54,11 +54,12 @@ public class SQLServer2005Dialect implements IDialect {
 
         String loweredString = originalSql.toLowerCase();
         String sqlPartString = originalSql;
-        if (loweredString.trim().startsWith("select")) {
-            int index = 6;
-            if (loweredString.startsWith("select distinct")) {
+        String trimStr = loweredString.trim();
+        if (trimStr.startsWith("select")) {
+            int index = loweredString.indexOf("select") + 6;
+            if (trimStr.startsWith("select distinct")) {
                 distinctStr = "DISTINCT ";
-                index = 15;
+                index = loweredString.indexOf("select distinct") + 15;
             }
             sqlPartString = sqlPartString.substring(index);
         }

+ 27 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/test/plugins/pagination/SQLServer2005DialectTest.java

@@ -0,0 +1,27 @@
+package com.baomidou.mybatisplus.test.plugins.pagination;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.SQLServer2005Dialect;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author nieqiurong
+ */
+public class SQLServer2005DialectTest {
+
+    private final SQLServer2005Dialect sqlServer2005Dialect = new SQLServer2005Dialect();
+
+    @Test
+    void test() {
+        Assertions.assertEquals(sqlServer2005Dialect.buildPaginationSql("select distinct *,(select 1) from test", 1, 10).getDialectSql(),
+            "WITH selectTemp AS (SELECT DISTINCT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__,  *,(select 1) from test) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 2 AND 11 ORDER BY __row_number__");
+        Assertions.assertEquals(sqlServer2005Dialect.buildPaginationSql(" select distinct *,(select 1) from test", 1, 10).getDialectSql(),
+            "WITH selectTemp AS (SELECT DISTINCT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__,  *,(select 1) from test) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 2 AND 11 ORDER BY __row_number__");
+
+        Assertions.assertEquals(sqlServer2005Dialect.buildPaginationSql("select *,(select 1) from test", 1, 10).getDialectSql(),
+            "WITH selectTemp AS (SELECT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__,  *,(select 1) from test) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 2 AND 11 ORDER BY __row_number__");
+        Assertions.assertEquals(sqlServer2005Dialect.buildPaginationSql(" select *,(select 1) from test", 1, 10).getDialectSql(),
+            "WITH selectTemp AS (SELECT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__,  *,(select 1) from test) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 2 AND 11 ORDER BY __row_number__");
+    }
+
+}