fklock-pgrowlocks.sql

text/plain

Filename: fklock-pgrowlocks.sql
Type: text/plain
Part: 2
Message: Re: foreign key locks, 2nd attempt
CREATE EXTENSION dblink;
CREATE EXTENSION pgrowlocks;

DO $$
BEGIN
	IF EXISTS (SELECT 1 FROM pg_proc WHERE oid = 'pgrowlocks'::regproc AND 'modes' = ANY (proargnames)) THEN
		CREATE OR REPLACE VIEW remote_rowlocks AS
		SELECT * FROM dblink('dbname=' || current_database(),
			$q$SELECT * FROM pgrowlocks('test_rowlock')$q$)
			AS t(locked_row tid, lock_type text, locker xid, multi boolean,
			     xids xid[], modes text[], pids integer[]);
	ELSE
		CREATE OR REPLACE VIEW remote_rowlocks AS
		SELECT * FROM dblink('dbname=' || current_database(),
			$q$SELECT * FROM pgrowlocks('test_rowlock')$q$)
			AS t(locked_row tid, lock_type text, locker xid, multi boolean,
			     xids xid[], pids integer[]);
	END IF;
END
$$;

DROP TABLE IF EXISTS test_rowlock;
CREATE TABLE test_rowlock (key_col int PRIMARY KEY, non_key_col int);
INSERT INTO test_rowlock VALUES (1,10);

BEGIN;
SELECT * FROM test_rowlock FOR KEY SHARE;
SELECT * FROM remote_rowlocks;
ROLLBACK;

BEGIN;
SELECT * FROM test_rowlock FOR SHARE;
SELECT * FROM remote_rowlocks;
ROLLBACK;

BEGIN;
SELECT * FROM test_rowlock FOR UPDATE;
SELECT * FROM remote_rowlocks;
ROLLBACK;

BEGIN;
UPDATE test_rowlock SET non_key_col = 11;
SELECT * FROM remote_rowlocks;
ROLLBACK;

BEGIN;
UPDATE test_rowlock SET key_col = 2;
SELECT * FROM remote_rowlocks;
ROLLBACK;