PostgreSQL 9.x と 12.x のSQL非互換の一例

CentOS 7のCGIをRocky/Alma8へ移行すると、PostgreSQLのバージョン非互換に遭遇することがある。
その一例。

バージョン情報

CentOS 7 : PostgreSQL 9.2.24
Rocky/Alma8: PostgreSQL 12.18

UPDATE文のROWキーワード

これは、Cent7まではOKで、Rocky/Alma8以降はNGになる例。

UPDATE table_name SET (clm1) = (val1) WHERE ....
ERROR:  複数列のUPDATE項目のソースは副問合せまたはROW()式でなければなりません

英語の場合のエラーメッセージの場合は以下のように表示される。

ERROR:  source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression


なお、カラムが複数ならRocky/Alma8でも問題ない。
SETの後に ( ) でカラムを指定する際は、複数でなければならないらしい。

UPDATE table_name SET (clm1, clm2) = (val1, val2) WHERE ....

あるいは、ROW というキーワードを付けても動作する。

UPDATE table_name SET (clm1) = ROW (val1) WHERE ....


UPDATE table_name SET clm1=val1, clm2=val2 WHERE ....
のように書いていれば問題ないが、参考にした書籍かサイトが古いと上記のようになってしまうのかもしれない。


以下の「問い合わせ」の説明が該当箇所
PostgreSQL 10 に関する技術情報

公式マニュアルの該当箇所
https://www.postgresql.jp/document/9.2/html/sql-update.html
https://www.postgresql.jp/document/12/html/sql-update.html


to_date などで不正な日付のチェックが厳格化

こちらは、PostgreSQLの日付関数が厳格になったもの。

Cent7(PG 9.x)

db=> SELECT TO_CHAR(TO_DATE('20240230', 'YYYYMMDD'), 'YYYY-MM-DD');
  to_char
------------
 2024-03-01

Rocky/Alma8以降(PG 12)

db=> SELECT TO_CHAR(TO_DATE('20240230', 'YYYYMMDD'), 'YYYY-MM-DD');
ERROR:  日付時刻のフィールドが範囲外です: "20240230"


PG 9.xまでは、存在しない2024年2月30日を指定した際に3月1日で返ってきていたが、PG 10以降ではエラーを返すようになった。


該当箇所は、PostgreSQL 10 リリースノートの以下の部分。

・to_timestamp()とto_date()が範囲外の入力フィールドを拒否するようにしました。 (Artur Zakirov)