mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Disallow LOCK TABLE outside a transaction block (or function), since this case
almost certainly represents user error. Per a gripe from Sebastian Böhm and subsequent discussion.
This commit is contained in:
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.299 2008/10/10 13:48:05 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.300 2008/11/04 00:57:19 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -938,6 +938,11 @@ ProcessUtility(Node *parsetree,
|
||||
break;
|
||||
|
||||
case T_LockStmt:
|
||||
/*
|
||||
* Since the lock would just get dropped immediately, LOCK TABLE
|
||||
* outside a transaction block is presumed to be user error.
|
||||
*/
|
||||
RequireTransactionChain(isTopLevel, "LOCK TABLE");
|
||||
LockTableCommand((LockStmt *) parsetree);
|
||||
break;
|
||||
|
||||
|
@ -45,7 +45,9 @@ INSERT INTO atest1 VALUES (1, 'one');
|
||||
DELETE FROM atest1;
|
||||
UPDATE atest1 SET a = 1 WHERE b = 'blech';
|
||||
TRUNCATE atest1;
|
||||
BEGIN;
|
||||
LOCK atest1 IN ACCESS EXCLUSIVE MODE;
|
||||
COMMIT;
|
||||
REVOKE ALL ON atest1 FROM PUBLIC;
|
||||
SELECT * FROM atest1;
|
||||
a | b
|
||||
@ -102,8 +104,10 @@ DELETE FROM atest2; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
TRUNCATE atest2; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
BEGIN;
|
||||
LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
COMMIT;
|
||||
COPY atest2 FROM stdin; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
GRANT ALL ON atest1 TO PUBLIC; -- fail
|
||||
@ -155,7 +159,9 @@ DELETE FROM atest2; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
TRUNCATE atest2; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
BEGIN;
|
||||
LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok
|
||||
COMMIT;
|
||||
COPY atest2 FROM stdin; -- fail
|
||||
ERROR: permission denied for relation atest2
|
||||
-- checks in subquery, both fail
|
||||
|
@ -48,7 +48,9 @@ INSERT INTO atest1 VALUES (1, 'one');
|
||||
DELETE FROM atest1;
|
||||
UPDATE atest1 SET a = 1 WHERE b = 'blech';
|
||||
TRUNCATE atest1;
|
||||
BEGIN;
|
||||
LOCK atest1 IN ACCESS EXCLUSIVE MODE;
|
||||
COMMIT;
|
||||
|
||||
REVOKE ALL ON atest1 FROM PUBLIC;
|
||||
SELECT * FROM atest1;
|
||||
@ -80,7 +82,9 @@ SELECT * FROM atest1 FOR UPDATE; -- ok
|
||||
SELECT * FROM atest2 FOR UPDATE; -- fail
|
||||
DELETE FROM atest2; -- fail
|
||||
TRUNCATE atest2; -- fail
|
||||
BEGIN;
|
||||
LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail
|
||||
COMMIT;
|
||||
COPY atest2 FROM stdin; -- fail
|
||||
GRANT ALL ON atest1 TO PUBLIC; -- fail
|
||||
|
||||
@ -105,7 +109,9 @@ SELECT * FROM atest1 FOR UPDATE; -- fail
|
||||
SELECT * FROM atest2 FOR UPDATE; -- fail
|
||||
DELETE FROM atest2; -- fail
|
||||
TRUNCATE atest2; -- fail
|
||||
BEGIN;
|
||||
LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok
|
||||
COMMIT;
|
||||
COPY atest2 FROM stdin; -- fail
|
||||
|
||||
-- checks in subquery, both fail
|
||||
|
Reference in New Issue
Block a user