Commit b651b2a5 authored by Tom Lane's avatar Tom Lane

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.
parent 2a6108ac
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
...@@ -1412,6 +1412,17 @@ heap_drop_with_catalog(Oid relid) ...@@ -1412,6 +1412,17 @@ heap_drop_with_catalog(Oid relid)
*/ */
rel = relation_open(relid, AccessExclusiveLock); 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. * Schedule unlinking of the relation's physical files at commit.
*/ */
......
...@@ -138,10 +138,10 @@ ...@@ -138,10 +138,10 @@
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 53: using PQexec [NO_PID]: ecpg_execute on line 53: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000 [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]: 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]: 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: XX000 [NO_PID]: sqlca: code: -400, state: 55006
sql error: relation 16491 is still open on line 53 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]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment