Disallow committing a prepared transaction unless we are in the same database
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Feb 2007 19:39:42 +0000 (19:39 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Feb 2007 19:39:42 +0000 (19:39 +0000)
it was executed in.  Someday it might be nice to allow cross-DB commits, but
work would be needed in NOTIFY and perhaps other places.  Per Heikki.

src/backend/access/transam/twophase.c

index 45220d119642c033e9c56f8ed017577ba1ffd66f..55f6b88bcd0799ccaa7c32a975536c0bc2e1005c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *     $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.27 2007/01/16 13:28:56 alvherre Exp $
+ *     $PostgreSQL: pgsql/src/backend/access/transam/twophase.c,v 1.28 2007/02/13 19:39:42 tgl Exp $
  *
  * NOTES
  *     Each global transaction is associated with a global transaction
@@ -393,6 +393,18 @@ LockGXact(const char *gid, Oid user)
                  errmsg("permission denied to finish prepared transaction"),
                     errhint("Must be superuser or the user that prepared the transaction.")));
 
+       /*
+        * Note: it probably would be possible to allow committing from another
+        * database; but at the moment NOTIFY is known not to work and there
+        * may be some other issues as well.  Hence disallow until someone
+        * gets motivated to make it work.
+        */
+       if (MyDatabaseId != gxact->proc.databaseId)
+           ereport(ERROR,
+                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                    errmsg("prepared transaction belongs to another database"),
+                    errhint("Connect to the database where the transaction was prepared to finish it.")));
+
        /* OK for me to lock it */
        gxact->locking_xid = GetTopTransactionId();