[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 メーリングリストの案内