S2Dao のIN句
いつの間にかIN句が使えるようになっていたので、IN句でのSELECTを試したのですが、
IN句の後に何かSQLがあった場合に、正しく動作しませんでした。
test.org.seasar.dao.parser.SqlParserImplTest にて testIn() のSQLを以下のように変更したところ、
String sql = "SELECT * FROM emp WHERE deptno IN /*deptnoList*/(10,20) ORDER BY empno"; String sql2 = "SELECT * FROM emp WHERE deptno IN (?, ?) ORDER BY empno";
SELECT * FROM emp WHERE deptno IN ?
となり、テストに失敗します。
それで、探ってみた所、
SqlTokenizerImpl#skipToken
に、問題があるようです。
ひょっとして、実装忘れ?という感じですが、
以下の「ここから〜ここまで」が必要では?
public String skipToken() { 省略... } else if (quoting && c == '?'' && (i + 1 >= sql_.length() || sql_.charAt(i + 1) != '?'')) { index = i + 1; break; // ここから --------------------------------------------------- } else if (quoting && c == ')' && (i + 1 >= sql_.length() || sql_.charAt(i + 1) != ')')) { index = i + 1; break; // ここまで --------------------------------------------------- } else if (quoting && c == quote) { index = i + 1; break; } } 省略... }
これも間違っているかも。
追記
上のコードのバックスラッシュが「?」に化けてます。
こういうのってMLに出した方がいいかな。