]> granicus.if.org Git - postgresql/commitdiff
Make sure we give an appropriate user-facing error when attempting
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 29 Nov 2008 00:13:21 +0000 (00:13 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 29 Nov 2008 00:13:21 +0000 (00:13 +0000)
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
src/interfaces/ecpg/test/expected/sql-fetch.stderr

index c2239cd3d2206bb968cac139ef6af28688d726eb..a711143f86cda6a9bcc2332ac002bb470d37991c 100644 (file)
@@ -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.
         */
index 3e4d7961c3baf57017851c87419e97e109a6ac9a..32781e2173a87442617dc9cd5c41870e6e57e166 100644 (file)
 [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