mirror of
https://github.com/postgres/postgres.git
synced 2025-12-12 02:37:31 +03:00
plpgsql's exec_eval_simple_expr() now has to take responsibility for
advancing ActiveSnapshot when we are inside a volatile function. Per example from Gaetano Mendola. Add a regression test to catch similar problems in future.
This commit is contained in:
@@ -2032,3 +2032,62 @@ ERROR: insert or update on table "slave" violates foreign key constraint "slave
|
||||
DETAIL: Key (f1)=(2) is not present in table "master".
|
||||
drop function trap_foreign_key(int);
|
||||
drop function trap_foreign_key_2();
|
||||
--
|
||||
-- Test proper snapshot handling in simple expressions
|
||||
--
|
||||
create temp table users(login text, id serial);
|
||||
NOTICE: CREATE TABLE will create implicit sequence "users_id_seq" for serial column "users.id"
|
||||
create function sp_id_user(a_login text) returns int as $$
|
||||
declare x int;
|
||||
begin
|
||||
select into x id from users where login = a_login;
|
||||
if found then return x; end if;
|
||||
return 0;
|
||||
end$$ language plpgsql stable;
|
||||
insert into users values('user1');
|
||||
select sp_id_user('user1');
|
||||
sp_id_user
|
||||
------------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
select sp_id_user('userx');
|
||||
sp_id_user
|
||||
------------
|
||||
0
|
||||
(1 row)
|
||||
|
||||
create function sp_add_user(a_login text) returns int as $$
|
||||
declare my_id_user int;
|
||||
begin
|
||||
my_id_user = sp_id_user( a_login );
|
||||
IF my_id_user > 0 THEN
|
||||
RETURN -1; -- error code for existing user
|
||||
END IF;
|
||||
INSERT INTO users ( login ) VALUES ( a_login );
|
||||
my_id_user = sp_id_user( a_login );
|
||||
IF my_id_user = 0 THEN
|
||||
RETURN -2; -- error code for insertion failure
|
||||
END IF;
|
||||
RETURN my_id_user;
|
||||
end$$ language plpgsql;
|
||||
select sp_add_user('user1');
|
||||
sp_add_user
|
||||
-------------
|
||||
-1
|
||||
(1 row)
|
||||
|
||||
select sp_add_user('user2');
|
||||
sp_add_user
|
||||
-------------
|
||||
2
|
||||
(1 row)
|
||||
|
||||
select sp_add_user('user2');
|
||||
sp_add_user
|
||||
-------------
|
||||
-1
|
||||
(1 row)
|
||||
|
||||
drop function sp_add_user(text);
|
||||
drop function sp_id_user(text);
|
||||
|
||||
@@ -1764,3 +1764,44 @@ commit; -- still fails
|
||||
|
||||
drop function trap_foreign_key(int);
|
||||
drop function trap_foreign_key_2();
|
||||
|
||||
--
|
||||
-- Test proper snapshot handling in simple expressions
|
||||
--
|
||||
|
||||
create temp table users(login text, id serial);
|
||||
|
||||
create function sp_id_user(a_login text) returns int as $$
|
||||
declare x int;
|
||||
begin
|
||||
select into x id from users where login = a_login;
|
||||
if found then return x; end if;
|
||||
return 0;
|
||||
end$$ language plpgsql stable;
|
||||
|
||||
insert into users values('user1');
|
||||
|
||||
select sp_id_user('user1');
|
||||
select sp_id_user('userx');
|
||||
|
||||
create function sp_add_user(a_login text) returns int as $$
|
||||
declare my_id_user int;
|
||||
begin
|
||||
my_id_user = sp_id_user( a_login );
|
||||
IF my_id_user > 0 THEN
|
||||
RETURN -1; -- error code for existing user
|
||||
END IF;
|
||||
INSERT INTO users ( login ) VALUES ( a_login );
|
||||
my_id_user = sp_id_user( a_login );
|
||||
IF my_id_user = 0 THEN
|
||||
RETURN -2; -- error code for insertion failure
|
||||
END IF;
|
||||
RETURN my_id_user;
|
||||
end$$ language plpgsql;
|
||||
|
||||
select sp_add_user('user1');
|
||||
select sp_add_user('user2');
|
||||
select sp_add_user('user2');
|
||||
|
||||
drop function sp_add_user(text);
|
||||
drop function sp_id_user(text);
|
||||
|
||||
Reference in New Issue
Block a user