[pgsql-jp: 41819] PostgreSQL暗黙の型変換の仕様について

小松直明 komatsunooo @ gmail.com
2015年 9月 1日 (火) 15:27:24 JST


お世話になっております。
小松と申します。

■背景
当システムにてPostgreSQLのバージョンアップを行うに当たって影響調査を行っています。

■環境
現行バージョン:PostgreSQL 8.1.3
次期バージョン:PostgreSQL 9.3.5

■事象
次期バージョン環境において、
以下SQLをJavaから文字列型を?へバインドさせて実行した所、キャストエラーとなりました。
現行バージョンでは同じ条件で問題なく動作しています。

select count(*) from TABLEA where columna = ?
 ※columnaはnumeric型

こちらについて8.3にバージョンアップされた際の型変換の仕様変更によるものと考え、
以下対処で明示的にキャストを追加する事でエラーは発生しなくなりました。

CREATE CAST (numeric AS character) WITH INOUT AS IMPLICIT;

https://www.postgresql.jp/document/8.3/html/release-8-3.html
 E.8.2.1. 一般
 ・文字以外のデータ型がTEXTへの自動キャストが行われないようになりました。

■お伺い事項(1)
上記対処によりキャストエラーが発生しなくなった事から、
上記HPに記載されている型変換の仕様変更によるものと考えます。

ただし本件、型変換の向きが逆(TEXT→数値)のようにも思えるのですが、
条件句で渡している文字列型(SQLの?にあたるもの)がカラムの数値型に変換されているのではなく、
カラムの数値型(SQLのcolumnaにあたるもの)が文字列型に変換されている認識で合っていますでしょうか。
(カラムの型に対して暗黙の型変換される事はあるのでしょうか。)

ちなみにキャストの明確なルールが記載されているページをご存知でしょうか。
以下の公式マニュアルには詳細な部分は触れられていませんでした。
https://www.postgresql.jp/document/9.4/html/typeconv.html


■お伺い事項(2)
上記方法で対処を行った場合、
以下NTT オープンソースソフトウェアセンタが公表している情報によると
インデックスが効かなくなるようなのですが、それ以外の影響は何かありますでしょうか。

http://lets.postgresql.jp/documents/tutorial/cast/
(内容抜粋)
 AS IMPLICIT
  多くの場合で自動的に変換されます。ただし、条件句で型変換が発生すると、
  インデックスを使えないなどのトラブルの原因になるので注意が必要です。


■お伺い事項(3)
上記HPで「キャストが発生することでインデックスが使用されない場合もあり」
という文言があるのですが、される場合とされない場合の具体的なケースについて
何か情報をお持ちでしたら共有頂けないでしょうか。


■お伺い事項(4)
お伺い事項(2)において「条件句で型変換が発生すると、インデックスを使えない」とありますが、
これは現行バージョンにおいても当てはまり、現在も条件句で暗黙の型変換を行っている場合、
インデックスが適応されていない認識で合っていますでしょうか。


以上、よろしくお願い致します。


pgsql-jp メーリングリストの案内