読者です 読者をやめる 読者になる 読者になる

ryhmrt’s blog

フィリピンから日本に戻った意識低い系プログラマの雑記

PostgreSQL 8.2 の暗黙の型変換の罠

はじめに

PostgreSQL 8.2 を使ったプロジェクトに携わることになったのですが、他のミドルウェアのバージョンの関係で手元にできあがったのが PostgreSQL 8.4 の環境になりました。

ダウングレードするのは面倒くさいし、大してバージョンも違わないから大丈夫だろうとタカを括ったら思いの外動きませんでした。

問題点

PostgreSQL 8.2 までは暗黙の型変換でいろいろなデータが文字列型に変換されて実行されるケースがあったのですが、PostgreSQL 8.3 からはそんな汚い動作はしないようになったそうです。

そのため、PostgreSQL 8.2 までは実行できたクエリも、PostgreSQL 8.3 以降では型エラーで実行できないケースがあるとのこと。

例えば select length(1); とか実行すると、PostgreSQL 8.3 以降では以下のようなエラーが出るはず。

ERROR:  function length(integer) does not exist at character 8
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
STATEMENT:  select length(1);

解決方法

将来的にPostgreSQLのバージョンアップとかもあるかもしれないし、と思い、PostgreSQL 8.4 で動くようにすることにしました。

自動キャストの設定を追加することである程度 PostgreSQL 8.2 の動作を再現できるということなので、まずはそれを設定。

そもそも型変換する必要がない箇所もあったので、そこはクエリをちまちま修正。

見事動作致しました。

本当は型変換が頻繁に発生しているのはおかしいので、根本的にデータ構造を見直さなきゃいけないんだろうけど...

参考