2009年10月19日月曜日

PostgreSQL:バージョンアップ時の仕様変更

PostgreSQLは、バージョンアップの際に互換性のない仕様変更が発生する場合があります。

ただし、元々アバウトであったデータ型の扱いが厳密になることが多いようで「本来エラーになるべきものが何故か動いていた」すなわち「期待される動作へと改善された」と言えるかもしれません。ここでは、特にSQL文の変更が発生したものを記録しておきます。

7.4 以降の int 型カラムの扱い

バージョン7.4以降では、int型カラムに対して「長さ0の文字列 ''」を格納することが出来なくなりました。not null 制約が付いてなければ、nullはOKです。

test=# \d inttest
    Table "public.inttest"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 value  | text    | 

test=# insert into inttest (id, value) values (null, 'text');
 |=!|INSERT 0 1
test=# insert into inttest (id, value) values ('', 'text');
ERROR:  invalid input syntax for integer: ""
test=# 

8.3 以降の char 型カラムの扱い

char型カラムに対して数字で比較した際に、8.1.4ではエラーにならなかったSQL文が、8.3.0では(正しく)エラーになるようになりました。

test=# \d chartest
      Table "public.chartest"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | integer      |
 value  | text         |
 flag   | character(1) |

test=#  select * from chartest where flag = 1;
ERROR:  operator does not exist: character = integer
LINE 1: select * from chartest where flag = 1;
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
test=#
8.1.4では、上記SQLがエラーにならず実行されます。

なお、私がこの仕様に気付いたのは環境を 8.1.4 から 8.3.0 にバージョンアップした際ですので、変更は 8.2 で加わったのかもしれません。しかしながら、その変更のタイミングを追う理由は特にありませんので「8.1.4 -> 8.3.0」として記録しておくことにします。

0 件のコメント:

コメントを投稿