[pgsql-jp: 30242] PostgreSQL7.3のJDBCライブラリのバグでしょうか?
Jin Utsugi
Jin.Utsugi @ unisys.co.jp
2003年 6月 26日 (木) 16:04:12 JST
いつも拝見させていただいています。宇津木と申します。
PostgreSQL7.3.3とJDBCを利用して、データベースの情報を
更新するコードを書いていたところ、
ResultSet.updateXXX
系のメソッドで、SQLExceptionが発生し
The column name id not found.
のエラーメッセージを出力しました。(もちろんプログラム内
では、存在しているカラム名を指定している。)
そこで、現象をもっと分かりやすくするために、サンプルを作成したところ、
次のような条件で、上記のエラーが発生することが分かりました。
条件1:テーブルのカラムが2つ以上ある
例:
create table t1 (
id varchar(5) primary key,
kind smallint,
name varchar(20),
...
)
条件2:取得するときのSQL文で、取得するカラムの値が2番目以降のものになっている。
アスタリスク(*)などで、1行の値すべてを取得していない。
例:
select t1.kind from t1 where id = '00001'
select t1.* from t1 where id = '00001' <--- * を利用した場合、エラーにならない。
条件3:上記のSQL文を実行し、ResultSetを取得して、updateXXX系のメソッドを呼ぶとエラーになる。
例:
String sql = "select t1.name from t1 where id = '00001'";
ResultSet rs = st.executeQuery(sql);
if (rs.netxt()) {
rs.updateShort("kind", (short)3); <--- ここでエラー発生
...
}
自分のプログラムミスという可能性も否定できないため、念のためOracleで同じサンプルを
動かしたところ、上手く動きました。
また、既知の問題かなと思い、本家のサイト(メーリングリスト)で検索してみましたが、
それらしいのを見つけることができませんでしたが、やはりバグなのでしょうか?
多分、ドライバのResultSetの実装している部分で、カラム名とインデックス番号あたりが
整合性がとれなくなっているのではないかと推測しています。
参考:サンプルを実行したときのエラースタックトレース
The column name id not found.
at org.postgresql.jdbc1.AbstractJdbc1ResultSet.findColumn(AbstractJdbc1ResultSet.java:528)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.isUpdateable(AbstractJdbc2ResultSet.java:1351)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.updateValue(AbstractJdbc2ResultSet.java:1468)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.updateShort(AbstractJdbc2ResultSet.java:1095)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.updateShort(AbstractJdbc2ResultSet.java:1151)
at JdbcTest.updateValue(JdbcTest.java:81)
at JdbcTest.main(JdbcTest.java:42)
pgsql-jp メーリングリストの案内