Skip to content

Commit d084424

Browse files
committed
/*%expand と */ の間のスペースはaliasとみなさないようにしました
これまでは /%expand と */ の間にスペースがある場合にそのスペースを aliasとみなしてExpandNodeを組み立てていましたが、それが原因で実行時に AbstractSelectQuery#prepare()でNullPointerExceptionが発生していました。 例えば次のようなSQLが該当します。 SELECT /*%expand */* FROM Hoge このSQLを含むSQLファイルに対応したDaoのメソッドを実行すると NullPointerExceptionが発生します。 次にスタックトレースを抜粋します。 java.lang.NullPointerException at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitExpandNode(NodePreparedSqlBuilder.java:582) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitExpandNode(NodePreparedSqlBuilder.java:82) at org.seasar.doma.internal.jdbc.sql.node.ExpandNode.accept(ExpandNode.java:63) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitSelectClauseNode(NodePreparedSqlBuilder.java:438) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitSelectClauseNode(NodePreparedSqlBuilder.java:82) at org.seasar.doma.internal.jdbc.sql.node.SelectClauseNode.accept(SelectClauseNode.java:40) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitSelectStatementNode(NodePreparedSqlBuilder.java:428) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitSelectStatementNode(NodePreparedSqlBuilder.java:82) at org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode.accept(SelectStatementNode.java:124) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitAnonymousNode(NodePreparedSqlBuilder.java:146) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.visitAnonymousNode(NodePreparedSqlBuilder.java:82) at org.seasar.doma.internal.jdbc.sql.node.AnonymousNode.accept(AnonymousNode.java:35) at org.seasar.doma.internal.jdbc.sql.NodePreparedSqlBuilder.build(NodePreparedSqlBuilder.java:137) at org.seasar.doma.jdbc.query.SqlFileSelectQuery.lambda$prepareSql$13(SqlFileSelectQuery.java:51) at org.seasar.doma.jdbc.query.SqlFileSelectQuery$$Lambda$6/1027007693.apply(Unknown Source) at org.seasar.doma.jdbc.query.AbstractSelectQuery.buildSql(AbstractSelectQuery.java:113) at org.seasar.doma.jdbc.query.SqlFileSelectQuery.prepareSql(SqlFileSelectQuery.java:47) at org.seasar.doma.jdbc.query.AbstractSelectQuery.prepare(AbstractSelectQuery.java:90) at org.seasar.doma.jdbc.query.SqlFileSelectQuery.prepare(SqlFileSelectQuery.java:39) この問題を解決するため /*%expand と */ の間にスペースのみがある場合は aliasとみなさないように修正しました。
1 parent 88a0fe0 commit d084424

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/main/java/org/seasar/doma/internal/jdbc/sql/SqlParser.java

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

18-
import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull;
18+
import static org.seasar.doma.internal.util.AssertionUtil.*;
1919

2020
import java.util.Deque;
2121
import java.util.Iterator;
@@ -52,6 +52,7 @@
5252
import org.seasar.doma.internal.jdbc.sql.node.WhereClauseNode;
5353
import org.seasar.doma.internal.jdbc.sql.node.WhitespaceNode;
5454
import org.seasar.doma.internal.jdbc.sql.node.WordNode;
55+
import org.seasar.doma.internal.util.StringUtil;
5556
import org.seasar.doma.jdbc.JdbcException;
5657
import org.seasar.doma.jdbc.SqlNode;
5758
import org.seasar.doma.message.Message;
@@ -451,7 +452,7 @@ protected void parseForBlockComment() {
451452

452453
protected void parseExpandBlockComment() {
453454
String alias = tokenType.extract(token);
454-
if (alias.isEmpty()) {
455+
if (alias.isEmpty() || StringUtil.isWhitespace(alias)) {
455456
alias = "\"\"";
456457
}
457458
ExpandNode node = new ExpandNode(getLocation(), alias, token);

src/test/java/org/seasar/doma/internal/jdbc/sql/SqlParserTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,18 @@ public void testExpand() throws Exception {
280280
assertEquals("select bbb, ccc from aaa", sql.getFormattedSql());
281281
}
282282

283+
public void testExpand_withSpace() throws Exception {
284+
ExpressionEvaluator evaluator = new ExpressionEvaluator();
285+
String testSql = "select /*%expand */* from aaa";
286+
SqlParser parser = new SqlParser(testSql);
287+
SqlNode sqlNode = parser.parse();
288+
PreparedSql sql = new NodePreparedSqlBuilder(config, SqlKind.SELECT,
289+
"dummyPath", evaluator, SqlLogType.FORMATTED,
290+
node -> Arrays.asList("bbb", "ccc")).build(sqlNode);
291+
assertEquals("select bbb, ccc from aaa", sql.getRawSql());
292+
assertEquals("select bbb, ccc from aaa", sql.getFormattedSql());
293+
}
294+
283295
public void testExpand_alias() throws Exception {
284296
ExpressionEvaluator evaluator = new ExpressionEvaluator();
285297
String testSql = "select /*%expand \"a\"*/* from aaa a";

0 commit comments

Comments
 (0)