From b651b2a5c257945ba0ef78df22948cf805ba2b57 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Sat, 29 Nov 2008 00:13:21 +0000 Subject: [PATCH] Make sure we give an appropriate user-facing error when attempting to drop a table that is referenced by an open cursor. Fix unstable ecpg regression test result that was produced by this oversight. --- src/backend/catalog/heap.c | 13 ++++++++++++- src/interfaces/ecpg/test/expected/sql-fetch.stderr | 8 ++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index c2239cd3d22..a711143f86c 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.346 2008/11/27 15:59:28 heikki Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.347 2008/11/29 00:13:21 tgl Exp $ * * * INTERFACE ROUTINES @@ -1412,6 +1412,17 @@ heap_drop_with_catalog(Oid relid) */ rel = relation_open(relid, AccessExclusiveLock); + /* + * There can no longer be anyone *else* touching the relation, but we + * might still have open queries or cursors in our own session. + */ + if (rel->rd_refcnt != 1) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot drop \"%s\" because " + "it is being used by active queries in this session", + RelationGetRelationName(rel)))); + /* * Schedule unlinking of the relation's physical files at commit. */ diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.stderr b/src/interfaces/ecpg/test/expected/sql-fetch.stderr index 3e4d7961c3b..32781e2173a 100644 --- a/src/interfaces/ecpg/test/expected/sql-fetch.stderr +++ b/src/interfaces/ecpg/test/expected/sql-fetch.stderr @@ -138,10 +138,10 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 53: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_check_PQresult on line 53: ERROR: relation 16491 is still open +[NO_PID]: ecpg_check_PQresult on line 53: ERROR: cannot drop "my_table" because it is being used by active queries in this session [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: raising sqlstate XX000 (sqlcode -400) on line 53: relation 16491 is still open on line 53 -[NO_PID]: sqlca: code: -400, state: XX000 -sql error: relation 16491 is still open on line 53 +[NO_PID]: raising sqlstate 55006 (sqlcode -400) on line 53: cannot drop "my_table" because it is being used by active queries in this session on line 53 +[NO_PID]: sqlca: code: -400, state: 55006 +sql error: cannot drop "my_table" because it is being used by active queries in this session on line 53 [NO_PID]: ecpg_finish: connection regress1 closed [NO_PID]: sqlca: code: 0, state: 00000 -- GitLab