非互換
外部トランザクションブロックがある状態で実行したCALL文の原子性の制御に誤りがありました。
Fujitsu Enterprise Postgres 16 SP1では、プロシージャの引数に指定したSTABLE属性の関数の動作結果を変更します。
postgres=# CREATE TABLE t_test (x int); CREATE TABLE postgres=# INSERT INTO t_test VALUES (0); INSERT 0 1 postgres=# CREATE FUNCTION f_get_x () RETURNS int postgres-# AS $$ postgres$# DECLARE l_result int; postgres$# BEGIN postgres$# SELECT x INTO l_result FROM t_test; postgres$# RETURN l_result; postgres$# END postgres$# $$ LANGUAGE plpgsql STABLE; CREATE FUNCTION postgres=# postgres=# CREATE PROCEDURE f_print_x (x int) postgres-# AS $$ postgres$# BEGIN postgres$# RAISE NOTICE 'f_print_x(%)', x; postgres$# END postgres$# $$ LANGUAGE plpgsql; CREATE PROCEDURE postgres=# BEGIN; BEGIN postgres=*# postgres=*# DO $$ postgres$*# BEGIN postgres$*# UPDATE t_test SET x = x + 1; postgres$*# RAISE NOTICE 'f_get_x(%)', f_get_x(); postgres$*# CALL f_print_x(f_get_x()); postgres$*# UPDATE t_test SET x = x + 1; postgres$*# RAISE NOTICE 'f_get_x(%)', f_get_x(); postgres$*# CALL f_print_x(f_get_x()); postgres$*# END postgres$*# $$; NOTICE: f_get_x(1) NOTICE: f_print_x(0) NOTICE: f_get_x(2) NOTICE: f_print_x(0) DO
postgres=# DO $$ postgres$# BEGIN postgres$# UPDATE t_test SET x = x + 1; postgres$# RAISE NOTICE 'f_get_x(%)', f_get_x(); postgres$# CALL f_print_x(f_get_x()); postgres$# UPDATE t_test SET x = x + 1; postgres$# RAISE NOTICE 'f_get_x(%)', f_get_x(); postgres$# CALL f_print_x(f_get_x()); postgres$# ROLLBACK; postgres$# END postgres$# $$; NOTICE: f_get_x(1) NOTICE: f_print_x(1) NOTICE: f_get_x(2) NOTICE: f_print_x(2) DO
対処方法
ありません。