summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-11-29 00:13:21 +0000
committerTom Lane2008-11-29 00:13:21 +0000
commitb651b2a5c257945ba0ef78df22948cf805ba2b57 (patch)
tree13f5c5a7f04ad3aea869777bc7231fb42b34f4aa
parent2a6108ac247ed27f084a25269288a2818371aec1 (diff)
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.
-rw-r--r--src/backend/catalog/heap.c13
-rw-r--r--src/interfaces/ecpg/test/expected/sql-fetch.stderr8
2 files changed, 16 insertions, 5 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index c2239cd3d2..a711143f86 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
@@ -1413,6 +1413,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.
*/
if (rel->rd_rel->relkind != RELKIND_VIEW &&
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.stderr b/src/interfaces/ecpg/test/expected/sql-fetch.stderr
index 3e4d7961c3..32781e2173 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