Skip to content

Commit 516e9b1

Browse files
committed
SQL Server の OPTION 句が存在するとページングが正しく実行されない問題を修正しました fix #62
1 parent b1939fa commit 516e9b1

30 files changed

+312
-111
lines changed

src/main/java/org/seasar/doma/internal/jdbc/dialect/Db2ForUpdateTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
3939
processed = true;
4040

4141
ForUpdateClauseNode forUpdate = new ForUpdateClauseNode(
42-
" for update with rs");
42+
"for update with rs");
4343

4444
SelectStatementNode result = new SelectStatementNode();
4545
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -49,6 +49,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
4949
result.setHavingClauseNode(node.getHavingClauseNode());
5050
result.setOrderByClauseNode(node.getOrderByClauseNode());
5151
result.setForUpdateClauseNode(forUpdate);
52+
result.setOptionClauseNode(node.getOptionClauseNode());
5253
return result;
5354
}
5455
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/Db2PagingTransformer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.seasar.doma.internal.jdbc.dialect;
1717

1818
import org.seasar.doma.internal.jdbc.sql.node.AnonymousNode;
19-
import org.seasar.doma.internal.jdbc.sql.node.ForUpdateClauseNode;
2019
import org.seasar.doma.internal.jdbc.sql.node.FragmentNode;
2120
import org.seasar.doma.internal.jdbc.sql.node.OrderByClauseNode;
2221
import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode;
@@ -63,10 +62,6 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
6362
}
6463
orderBy.appendNode(new FragmentNode(" fetch first " + limit
6564
+ " rows only"));
66-
ForUpdateClauseNode forUpdate = node.getForUpdateClauseNode();
67-
if (node.getForUpdateClauseNode() != null) {
68-
orderBy.appendNode(new FragmentNode(" "));
69-
}
7065

7166
SelectStatementNode result = new SelectStatementNode();
7267
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -75,7 +70,8 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
7570
result.setGroupByClauseNode(node.getGroupByClauseNode());
7671
result.setHavingClauseNode(node.getHavingClauseNode());
7772
result.setOrderByClauseNode(orderBy);
78-
result.setForUpdateClauseNode(forUpdate);
73+
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
74+
result.setOptionClauseNode(node.getOptionClauseNode());
7975
return result;
8076
}
8177

src/main/java/org/seasar/doma/internal/jdbc/dialect/H212126ForUpdateTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
3838
}
3939
processed = true;
4040

41-
ForUpdateClauseNode forUpdate = new ForUpdateClauseNode(" for update");
41+
ForUpdateClauseNode forUpdate = new ForUpdateClauseNode("for update");
4242

4343
SelectStatementNode result = new SelectStatementNode();
4444
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -48,6 +48,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
4848
result.setHavingClauseNode(node.getHavingClauseNode());
4949
result.setOrderByClauseNode(node.getOrderByClauseNode());
5050
result.setForUpdateClauseNode(forUpdate);
51+
result.setOptionClauseNode(node.getOptionClauseNode());
5152
return result;
5253
}
5354
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/H212126PagingTransformer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.seasar.doma.internal.jdbc.dialect;
1717

18-
import org.seasar.doma.internal.jdbc.sql.node.ForUpdateClauseNode;
1918
import org.seasar.doma.internal.jdbc.sql.node.FragmentNode;
2019
import org.seasar.doma.internal.jdbc.sql.node.OrderByClauseNode;
2120
import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode;
@@ -60,10 +59,6 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
6059
orderBy.appendNode(new FragmentNode(" offset "));
6160
orderBy.appendNode(new FragmentNode(String.valueOf(offset)));
6261
}
63-
ForUpdateClauseNode forUpdate = node.getForUpdateClauseNode();
64-
if (node.getForUpdateClauseNode() != null) {
65-
orderBy.appendNode(new FragmentNode(" "));
66-
}
6762

6863
SelectStatementNode result = new SelectStatementNode();
6964
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -72,7 +67,8 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
7267
result.setGroupByClauseNode(node.getGroupByClauseNode());
7368
result.setHavingClauseNode(node.getHavingClauseNode());
7469
result.setOrderByClauseNode(orderBy);
75-
result.setForUpdateClauseNode(forUpdate);
70+
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
71+
result.setOptionClauseNode(node.getOptionClauseNode());
7672
return result;
7773
}
7874
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/H2PagingTransformer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.seasar.doma.internal.jdbc.dialect;
1717

18-
import org.seasar.doma.internal.jdbc.sql.node.ForUpdateClauseNode;
1918
import org.seasar.doma.internal.jdbc.sql.node.FragmentNode;
2019
import org.seasar.doma.internal.jdbc.sql.node.OrderByClauseNode;
2120
import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode;
@@ -58,10 +57,6 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
5857
orderBy.appendNode(new FragmentNode(" offset "));
5958
orderBy.appendNode(new FragmentNode(String.valueOf(offset)));
6059
}
61-
ForUpdateClauseNode forUpdate = node.getForUpdateClauseNode();
62-
if (node.getForUpdateClauseNode() != null) {
63-
orderBy.appendNode(new FragmentNode(" "));
64-
}
6560

6661
SelectStatementNode result = new SelectStatementNode();
6762
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -70,7 +65,8 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
7065
result.setGroupByClauseNode(node.getGroupByClauseNode());
7166
result.setHavingClauseNode(node.getHavingClauseNode());
7267
result.setOrderByClauseNode(orderBy);
73-
result.setForUpdateClauseNode(forUpdate);
68+
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
69+
result.setOptionClauseNode(node.getOptionClauseNode());
7470
return result;
7571
}
7672
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/HsqldbPagingTransformer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.seasar.doma.internal.jdbc.dialect;
1717

18-
import org.seasar.doma.internal.jdbc.sql.node.ForUpdateClauseNode;
1918
import org.seasar.doma.internal.jdbc.sql.node.FragmentNode;
2019
import org.seasar.doma.internal.jdbc.sql.node.OrderByClauseNode;
2120
import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode;
@@ -58,10 +57,6 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
5857
orderBy.appendNode(new FragmentNode(" offset "));
5958
orderBy.appendNode(new FragmentNode(String.valueOf(offset)));
6059
}
61-
ForUpdateClauseNode forUpdate = node.getForUpdateClauseNode();
62-
if (forUpdate != null) {
63-
orderBy.appendNode(new FragmentNode(" "));
64-
}
6560

6661
SelectStatementNode result = new SelectStatementNode();
6762
result.setSelectClauseNode(node.getSelectClauseNode());
@@ -70,7 +65,8 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
7065
result.setGroupByClauseNode(node.getGroupByClauseNode());
7166
result.setHavingClauseNode(node.getHavingClauseNode());
7267
result.setOrderByClauseNode(orderBy);
73-
result.setForUpdateClauseNode(forUpdate);
68+
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
69+
result.setOptionClauseNode(node.getOptionClauseNode());
7470
return result;
7571
}
7672
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/Mssql2008ForUpdateTransformer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
5959
result.setGroupByClauseNode(node.getGroupByClauseNode());
6060
result.setHavingClauseNode(node.getHavingClauseNode());
6161
result.setOrderByClauseNode(node.getOrderByClauseNode());
62+
result.setOptionClauseNode(node.getOptionClauseNode());
6263
return result;
6364
}
6465
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/Mssql2008PagingTransformer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ protected SqlNode appendTopNode(SelectStatementNode node) {
6969
result.setHavingClauseNode(node.getHavingClauseNode());
7070
result.setOrderByClauseNode(node.getOrderByClauseNode());
7171
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
72+
result.setOptionClauseNode(node.getOptionClauseNode());
7273
return result;
7374
}
7475
}

src/main/java/org/seasar/doma/internal/jdbc/dialect/MssqlPagingTransformer.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.seasar.doma.jdbc.SqlNode;
2323
import org.seasar.doma.message.Message;
2424

25-
2625
/**
2726
* @author taedium
2827
*
@@ -31,7 +30,8 @@ public class MssqlPagingTransformer extends Mssql2008PagingTransformer {
3130

3231
private boolean forceOffsetFetch;
3332

34-
public MssqlPagingTransformer(long offset, long limit, boolean forceOffsetFetch) {
33+
public MssqlPagingTransformer(long offset, long limit,
34+
boolean forceOffsetFetch) {
3535
super(offset, limit);
3636
this.forceOffsetFetch = forceOffsetFetch;
3737
}
@@ -42,7 +42,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
4242
return node;
4343
}
4444
processed = true;
45-
45+
4646
if (!forceOffsetFetch && offset <= 0) {
4747
return super.appendTopNode(node);
4848
}
@@ -54,7 +54,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
5454

5555
OrderByClauseNode orderBy = new OrderByClauseNode(
5656
originalOrderBy.getWordNode());
57-
57+
5858
for (SqlNode child : originalOrderBy.getChildren()) {
5959
orderBy.appendNode(child);
6060
}
@@ -70,10 +70,6 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
7070
orderBy.appendNode(new FragmentNode(" rows only"));
7171
}
7272

73-
if (node.getForUpdateClauseNode() != null) {
74-
orderBy.appendNode(new FragmentNode(" "));
75-
}
76-
7773
SelectStatementNode result = new SelectStatementNode();
7874
result.setSelectClauseNode(node.getSelectClauseNode());
7975
result.setFromClauseNode(node.getFromClauseNode());
@@ -82,6 +78,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
8278
result.setHavingClauseNode(node.getHavingClauseNode());
8379
result.setOrderByClauseNode(orderBy);
8480
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
81+
result.setOptionClauseNode(node.getOptionClauseNode());
8582
return result;
8683
}
8784

src/main/java/org/seasar/doma/internal/jdbc/dialect/MysqlCountCalculatingTransformer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
4848
result.setHavingClauseNode(node.getHavingClauseNode());
4949
result.setOrderByClauseNode(node.getOrderByClauseNode());
5050
result.setForUpdateClauseNode(node.getForUpdateClauseNode());
51+
result.setOptionClauseNode(node.getOptionClauseNode());
5152
return result;
5253
}
5354
}

0 commit comments

Comments
 (0)