mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Replace nested-BEGIN syntax for subtransactions with spec-compliant
SAVEPOINT/RELEASE/ROLLBACK-TO syntax. (Alvaro) Cause COMMIT of a failed transaction to report ROLLBACK instead of COMMIT in its command tag. (Tom) Fix a few loose ends in the nested-transactions stuff.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.424 2004/07/17 03:29:00 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.425 2004/07/27 05:11:03 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* this is the "main" module of the postgres backend and
|
||||
@@ -841,8 +841,8 @@ exec_simple_query(const char *query_string)
|
||||
TransactionStmt *stmt = (TransactionStmt *) parsetree;
|
||||
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_BEGIN ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK)
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
allowit = true;
|
||||
}
|
||||
|
||||
@@ -1162,8 +1162,8 @@ exec_parse_message(const char *query_string, /* string to execute */
|
||||
TransactionStmt *stmt = (TransactionStmt *) parsetree;
|
||||
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_BEGIN ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK)
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
allowit = true;
|
||||
}
|
||||
|
||||
@@ -1625,8 +1625,8 @@ exec_execute_message(const char *portal_name, long max_rows)
|
||||
|
||||
is_trans_stmt = true;
|
||||
if (stmt->kind == TRANS_STMT_COMMIT ||
|
||||
stmt->kind == TRANS_STMT_BEGIN ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK)
|
||||
stmt->kind == TRANS_STMT_ROLLBACK ||
|
||||
stmt->kind == TRANS_STMT_ROLLBACK_TO)
|
||||
is_trans_exit = true;
|
||||
}
|
||||
}
|
||||
@@ -2810,6 +2810,9 @@ PostgresMain(int argc, char *argv[], const char *username)
|
||||
*/
|
||||
MemoryContextSwitchTo(ErrorContext);
|
||||
|
||||
/* Make sure we are using a sane ResourceOwner, too */
|
||||
CurrentResourceOwner = CurTransactionResourceOwner;
|
||||
|
||||
/* Do the recovery */
|
||||
ereport(DEBUG2,
|
||||
(errmsg_internal("AbortCurrentTransaction")));
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.220 2004/06/25 21:55:57 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.221 2004/07/27 05:11:03 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -354,12 +354,51 @@ ProcessUtility(Node *parsetree,
|
||||
break;
|
||||
|
||||
case TRANS_STMT_COMMIT:
|
||||
EndTransactionBlock();
|
||||
if (!EndTransactionBlock())
|
||||
{
|
||||
/* report unsuccessful commit in completionTag */
|
||||
if (completionTag)
|
||||
strcpy(completionTag, "ROLLBACK");
|
||||
}
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK:
|
||||
UserAbortTransactionBlock();
|
||||
break;
|
||||
|
||||
case TRANS_STMT_SAVEPOINT:
|
||||
{
|
||||
ListCell *cell;
|
||||
char *name = NULL;
|
||||
|
||||
RequireTransactionChain((void *)stmt, "SAVEPOINT");
|
||||
|
||||
foreach (cell, stmt->options)
|
||||
{
|
||||
DefElem *elem = lfirst(cell);
|
||||
if (strcmp(elem->defname, "savepoint_name") == 0)
|
||||
name = strVal(elem->arg);
|
||||
}
|
||||
|
||||
Assert(PointerIsValid(name));
|
||||
|
||||
DefineSavepoint(name);
|
||||
}
|
||||
break;
|
||||
|
||||
case TRANS_STMT_RELEASE:
|
||||
RequireTransactionChain((void *)stmt, "RELEASE");
|
||||
ReleaseSavepoint(stmt->options);
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK_TO:
|
||||
RequireTransactionChain((void *)stmt, "ROLLBACK TO");
|
||||
RollbackToSavepoint(stmt->options);
|
||||
/*
|
||||
* CommitTransactionCommand is in charge
|
||||
* of re-defining the savepoint again
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1114,9 +1153,18 @@ CreateCommandTag(Node *parsetree)
|
||||
break;
|
||||
|
||||
case TRANS_STMT_ROLLBACK:
|
||||
case TRANS_STMT_ROLLBACK_TO:
|
||||
tag = "ROLLBACK";
|
||||
break;
|
||||
|
||||
case TRANS_STMT_SAVEPOINT:
|
||||
tag = "SAVEPOINT";
|
||||
break;
|
||||
|
||||
case TRANS_STMT_RELEASE:
|
||||
tag = "RELEASE";
|
||||
break;
|
||||
|
||||
default:
|
||||
tag = "???";
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user