ページの先頭行へ戻る
Enterprise Postgres 17 リリース情報

2.2.32 プロシージャの引数に指定されたSTABLE属性関数の動作変更

非互換

外部トランザクションブロックがある状態で実行したCALL文の原子性の制御に誤りがありました。

Fujitsu Enterprise Postgres 16 SP1では、プロシージャの引数に指定したSTABLE属性の関数の動作結果を変更します。

Fujitsu Enterprise Postgres 16以前の場合
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
Fujitsu Enterprise Postgres 16 SP1の場合
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

対処方法

ありません。