[DAO-72] SQLコメント中の?があるとjava.lang.ArrayIndexOutOfBoundsExceptionが起こることがある Created: 2007-02-21  Updated: 2007-04-05  Resolved: 2007-04-05

Status: Resolved
Project: S2Dao
Component/s: s2dao
Affects Version/s: 1.0.40
Fix Version/s: 1.0.41

Type: Bug Priority: Major
Reporter: T.Tanaka Assignee: azusa
Resolution: Fixed Votes: 0
Labels: None

Attachments: Text File seasar2.patch    

 Description   

再現方法:
S2Dao 1.0.40に含まれるUnitTestに対して、以下の修正を行なうことにより再現できます。

修正箇所:
s2dao\s2-dao\src\test\resources\org\seasar\dao\impl\DefaultTest$DefaultTableDao_insertBySql.sql

% diff u DefaultTest$DefaultTableDao_insertBySql.sql DefaultTest$DefaultTableDao_insertBySql.sql
— DefaultTest$DefaultTableDao_insertBySql.sql- Wed Nov 01 01:17:00 2006

+++ DefaultTest$DefaultTableDao_insertBySql.sql Wed Feb 21 11:50:48 2007
@@ -3,7 +3,9 @@
/IF dto.bbb != null/BBB,/END/
VERSION_NO
) VALUES (
+ /* パート */
/IF dto.aaa != null//dto.aaa/null,/END/
/IF dto.bbb != null//dto.bbb/null,/END/
0
+ /* コメント中の? */
)

実行例:
% cd \s2dao\s2-dao\
% mvn test -Dtest=DefaultTest
...
% more target\surefire-reports\org.seasar.dao.impl.DefaultTest.txt
-------------------------------------------------------------------------------
Test set: org.seasar.dao.impl.DefaultTest
-------------------------------------------------------------------------------
Tests run: 11, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 4.517 sec <<< FAILURE!
testInsertByManualSqlTx(org.seasar.dao.impl.DefaultTest) Time elapsed: 0.187 sec <<< ERROR!
java.lang.ArrayIndexOutOfBoundsException: 1
at org.seasar.extension.jdbc.impl.BasicHandler.getCompleteSql(BasicHandler.java:148)
at org.seasar.extension.jdbc.impl.BasicUpdateHandler.execute(BasicUpdateHandler.java:62)
...



 Comments   
Comment by azusa [ 2007-04-05 ]

対応完了しました。

Comment by azusa [ 2007-04-03 ]

すみません、ELSEコメント内の?まで消しちゃってましたm(__)m
あと改行コードの正規表現も間違ってるので修正します、すみません。

Comment by azusa [ 2007-04-02 ]

ラインコメント中の?に対応しました。(r811)
(今まではラインコメント中に?があった場合バインド変数として認識していた
みたいですが、これも治ったはずです。)

Comment by azusa [ 2007-04-02 ]

・SQLコメント中の?を実行前に除外するようにしました。(ラインコメントは未対応)
・埋め込み変数コメントの値に?が使われた場合、実行前に例外になるようにしました。
(r809)

Comment by jflute [ 2007-02-22 ]

コミットさせて頂きました。

org.seasar.dao.impl.DefaultTest に
causeArrayIndexOutOfBoundsByVariableCommentAtDebugSql()
を追加してあります。

Comment by azusa [ 2007-02-21 ]

>すいません、こういった例外ケースのテストって、
>どこにコミットすればよいものでしょうか?

org.seasar.dao.impl.DefaultTest あたりでいいのではないでしょうか。

テストケースとしてコミットするとビルドできなくなるので
メソッド名は'test'で始まらないようにしてください。

Comment by jflute [ 2007-02-21 ]

> このSQLで再現しないのでできれば再現ケースをコミットいただけないでしょうか >久保さん

すいません、自分でも試しなおしたらちょっと表現が適切ではありませんでした。

テスト値ではなく、

「埋め込み変数コメントの文字列の中に「?」が存在すると発生します」

<Dao>
public String getEmployee_ARGS = "empno,tmp";
public Employee getEmployee(int empno, String tmp);

<SQL>
SELECT emp.*, dept.dname dname_0, dept.loc loc_0 FROM emp, dept
/$tmp/
WHERE empno = /empno/7788 AND emp.deptno = dept.deptno

<Test>
employeeDao.getEmployee(7788, "tttttt?tt");

で発生しました。

自分業務で発生してしまっていたのも埋め込み変数コメントでした。
その埋め込み変数コメントの文字列の中に /xxx/'testvalue' という
文字列が含まれていたのですが、そのtestvalueに ? を入れて例外だったので、
テスト値と勘違いしてしまいました。真に申し訳御座いません。

すいません、こういった例外ケースのテストって、
どこにコミットすればよいものでしょうか?

Comment by azusa [ 2007-02-21 ]

CONTAINER-31を登録しました。

細かいですが、Bind変数コメントのテスト値の値に?(はてな)を含めると同様の現象が発生します。

こんな感じでしょうか?
value = /*dto.property */'はてな?'

INSERT INTO DEFAULT_TABLE (
/IF dto.aaa != null/AAA,/END/
/IF dto.bbb != null/BBB,/END/
VERSION_NO
) VALUES (
/* aaa */
/IF dto.aaa != null//dto.aaa/'はてな?',/END/
/IF dto.bbb != null//dto.bbb/null,/END/
0
/* ccc */
)

このSQLで再現しないのでできれば再現ケースをコミットいただけないでしょうか >久保さん

Comment by jflute [ 2007-02-21 ]

細かいですが、Bind変数コメントのテスト値の値に?(はてな)を含めると同様の現象が発生します。
テスト値に?(はてな)を使わなければ問題ないですが、処理的に可能であれば、
「Bind変数コメントのテスト値内の?(はてな)」を除外するように一緒にお願いできないでしょうか?
(ダメならダメでそういう仕様でもOKだとは思います。が初めてその例外に遭遇した人は何がなんだかわからないはずなので)

Comment by azusa [ 2007-02-21 ]

再現テストをコミットしました。
org.seasar.dao.impl.DefaultTest#InsertByManualSql2Txです。

Seasar2(s2conitainer)側で
コメント内の「?」を削除してもらうようお願いしてみます。

Comment by T.Tanaka [ 2007-02-21 ]

回避方法1:
コメント中から ? を削除すれば動作するようです。

回避方法2:
起こるのは、log4j.category.org.seasar=DEBUGの場合のようです。
log4j.category.org.seasar=INFOなどでは、例外は発生せず、動作も正常のようです。

Generated at Thu Apr 17 21:34:17 JST 2025 using Jira 10.5.0#10050000-sha1:9d9d098bb7b67e8dba8da380ba9c3900d82ac3cf.