2

PostgreSQL 8.1 を使用しています。

この関数の暗黙的なキャストで何が起こっているのか、私は困惑しています:

CREATE OR REPLACE FUNCTION this_is_weird(v_input TEXT)
RETURNS TEXT AS $$
BEGIN
        IF v_input > 113 THEN
                RETURN 'answer1';
        ELSE
                RETURN 'answer2';
        END IF;
END;
$$ LANGUAGE plpgsql;

入力'17'(文字列として) は戻り値を返します'answer1'。しかし、私がタイプすると

SELECT '17' > 113

psqlで、私は得る'f'.

(もちろん、明示的なキャストを追加することで問題を解決できますv_input::integer。)

4

1 に答える 1

2

字句比較では17 より大きい113:

regress=> SELECT '17' > '113';
?column? 
----------
 t
(1 row)

数値比較が必要な場合は、テキスト比較を行わないでください。

テキスト値を数値と比較しているため、数値はテキストにキャストされ、テキストとして比較されます。サーバーが必要に応じてオペランドをテキストに暗黙的にキャストする非常に古い PostgreSQL バージョンの誤機能に依存しているため、コードは「機能」します (つまり、エラーなしで実行されます)。これにより、アプリケーションのバグが隠蔽されることが証明され、暗黙のうちに誤ったコードを簡単に記述できるようになったため、8.3 で暗黙的なキャストが削除されました。このトピックに関する情報については、Peter のブログ エントリを参照してください。

PostgreSQL 8.3 以降では、コードでエラーが発生します。

アップグレードを計画する必要があります。長期的には、さまざまな理由で時間と手間を節約できます。max_fsm_pages自動調整を支持しての削除。可視性マップ; 自動バキュームが大幅に改善されました。...パフォーマンスの向上が必要ない場合でも、アップグレードには多くの利点があります。アップグレードと互換性のアドバイスについては、各メジャー バージョン (8.2.0、8.3.0 など) のリリース ノートをお読みください。

于 2013-03-28T00:02:21.543 に答える