Simplify parse representation of savepoint commands

Instead of embedding the savepoint name in a list and then requiring
complex code to unpack it, just add another struct field to store it
directly.

Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
This commit is contained in:
Peter Eisentraut 2018-02-16 20:57:06 -05:00
parent 04700b685f
commit ec87efde8d
7 changed files with 17 additions and 59 deletions

View File

@ -3908,13 +3908,11 @@ DefineSavepoint(const char *name)
* As above, we don't actually do anything here except change blockState. * As above, we don't actually do anything here except change blockState.
*/ */
void void
ReleaseSavepoint(List *options) ReleaseSavepoint(const char *name)
{ {
TransactionState s = CurrentTransactionState; TransactionState s = CurrentTransactionState;
TransactionState target, TransactionState target,
xact; xact;
ListCell *cell;
char *name = NULL;
/* /*
* Workers synchronize transaction state at the beginning of each parallel * Workers synchronize transaction state at the beginning of each parallel
@ -3978,16 +3976,6 @@ ReleaseSavepoint(List *options)
break; break;
} }
foreach(cell, options)
{
DefElem *elem = lfirst(cell);
if (strcmp(elem->defname, "savepoint_name") == 0)
name = strVal(elem->arg);
}
Assert(PointerIsValid(name));
for (target = s; PointerIsValid(target); target = target->parent) for (target = s; PointerIsValid(target); target = target->parent)
{ {
if (PointerIsValid(target->name) && strcmp(target->name, name) == 0) if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)
@ -4029,13 +4017,11 @@ ReleaseSavepoint(List *options)
* As above, we don't actually do anything here except change blockState. * As above, we don't actually do anything here except change blockState.
*/ */
void void
RollbackToSavepoint(List *options) RollbackToSavepoint(const char *name)
{ {
TransactionState s = CurrentTransactionState; TransactionState s = CurrentTransactionState;
TransactionState target, TransactionState target,
xact; xact;
ListCell *cell;
char *name = NULL;
/* /*
* Workers synchronize transaction state at the beginning of each parallel * Workers synchronize transaction state at the beginning of each parallel
@ -4099,16 +4085,6 @@ RollbackToSavepoint(List *options)
break; break;
} }
foreach(cell, options)
{
DefElem *elem = lfirst(cell);
if (strcmp(elem->defname, "savepoint_name") == 0)
name = strVal(elem->arg);
}
Assert(PointerIsValid(name));
for (target = s; PointerIsValid(target); target = target->parent) for (target = s; PointerIsValid(target); target = target->parent)
{ {
if (PointerIsValid(target->name) && strcmp(target->name, name) == 0) if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)

View File

@ -3602,6 +3602,7 @@ _copyTransactionStmt(const TransactionStmt *from)
COPY_SCALAR_FIELD(kind); COPY_SCALAR_FIELD(kind);
COPY_NODE_FIELD(options); COPY_NODE_FIELD(options);
COPY_STRING_FIELD(savepoint_name);
COPY_STRING_FIELD(gid); COPY_STRING_FIELD(gid);
return newnode; return newnode;

View File

@ -1513,6 +1513,7 @@ _equalTransactionStmt(const TransactionStmt *a, const TransactionStmt *b)
{ {
COMPARE_SCALAR_FIELD(kind); COMPARE_SCALAR_FIELD(kind);
COMPARE_NODE_FIELD(options); COMPARE_NODE_FIELD(options);
COMPARE_STRING_FIELD(savepoint_name);
COMPARE_STRING_FIELD(gid); COMPARE_STRING_FIELD(gid);
return true; return true;

View File

@ -9876,40 +9876,35 @@ TransactionStmt:
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->kind = TRANS_STMT_SAVEPOINT; n->kind = TRANS_STMT_SAVEPOINT;
n->options = list_make1(makeDefElem("savepoint_name", n->savepoint_name = $2;
(Node *)makeString($2), @1));
$$ = (Node *)n; $$ = (Node *)n;
} }
| RELEASE SAVEPOINT ColId | RELEASE SAVEPOINT ColId
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->kind = TRANS_STMT_RELEASE; n->kind = TRANS_STMT_RELEASE;
n->options = list_make1(makeDefElem("savepoint_name", n->savepoint_name = $3;
(Node *)makeString($3), @1));
$$ = (Node *)n; $$ = (Node *)n;
} }
| RELEASE ColId | RELEASE ColId
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->kind = TRANS_STMT_RELEASE; n->kind = TRANS_STMT_RELEASE;
n->options = list_make1(makeDefElem("savepoint_name", n->savepoint_name = $2;
(Node *)makeString($2), @1));
$$ = (Node *)n; $$ = (Node *)n;
} }
| ROLLBACK opt_transaction TO SAVEPOINT ColId | ROLLBACK opt_transaction TO SAVEPOINT ColId
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->kind = TRANS_STMT_ROLLBACK_TO; n->kind = TRANS_STMT_ROLLBACK_TO;
n->options = list_make1(makeDefElem("savepoint_name", n->savepoint_name = $5;
(Node *)makeString($5), @1));
$$ = (Node *)n; $$ = (Node *)n;
} }
| ROLLBACK opt_transaction TO ColId | ROLLBACK opt_transaction TO ColId
{ {
TransactionStmt *n = makeNode(TransactionStmt); TransactionStmt *n = makeNode(TransactionStmt);
n->kind = TRANS_STMT_ROLLBACK_TO; n->kind = TRANS_STMT_ROLLBACK_TO;
n->options = list_make1(makeDefElem("savepoint_name", n->savepoint_name = $4;
(Node *)makeString($4), @1));
$$ = (Node *)n; $$ = (Node *)n;
} }
| PREPARE TRANSACTION Sconst | PREPARE TRANSACTION Sconst

View File

@ -469,34 +469,18 @@ standard_ProcessUtility(PlannedStmt *pstmt,
break; break;
case TRANS_STMT_SAVEPOINT: case TRANS_STMT_SAVEPOINT:
{
ListCell *cell;
char *name = NULL;
RequireTransactionBlock(isTopLevel, "SAVEPOINT"); RequireTransactionBlock(isTopLevel, "SAVEPOINT");
DefineSavepoint(stmt->savepoint_name);
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; break;
case TRANS_STMT_RELEASE: case TRANS_STMT_RELEASE:
RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT"); RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
ReleaseSavepoint(stmt->options); ReleaseSavepoint(stmt->savepoint_name);
break; break;
case TRANS_STMT_ROLLBACK_TO: case TRANS_STMT_ROLLBACK_TO:
RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT"); RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT");
RollbackToSavepoint(stmt->options); RollbackToSavepoint(stmt->savepoint_name);
/* /*
* CommitTransactionCommand is in charge of * CommitTransactionCommand is in charge of

View File

@ -354,9 +354,9 @@ extern bool PrepareTransactionBlock(const char *gid);
extern void UserAbortTransactionBlock(void); extern void UserAbortTransactionBlock(void);
extern void BeginImplicitTransactionBlock(void); extern void BeginImplicitTransactionBlock(void);
extern void EndImplicitTransactionBlock(void); extern void EndImplicitTransactionBlock(void);
extern void ReleaseSavepoint(List *options); extern void ReleaseSavepoint(const char *name);
extern void DefineSavepoint(const char *name); extern void DefineSavepoint(const char *name);
extern void RollbackToSavepoint(List *options); extern void RollbackToSavepoint(const char *name);
extern void BeginInternalSubTransaction(const char *name); extern void BeginInternalSubTransaction(const char *name);
extern void ReleaseCurrentSubTransaction(void); extern void ReleaseCurrentSubTransaction(void);
extern void RollbackAndReleaseCurrentSubTransaction(void); extern void RollbackAndReleaseCurrentSubTransaction(void);

View File

@ -2966,7 +2966,8 @@ typedef struct TransactionStmt
{ {
NodeTag type; NodeTag type;
TransactionStmtKind kind; /* see above */ TransactionStmtKind kind; /* see above */
List *options; /* for BEGIN/START and savepoint commands */ List *options; /* for BEGIN/START commands */
char *savepoint_name; /* for savepoint commands */
char *gid; /* for two-phase-commit related commands */ char *gid; /* for two-phase-commit related commands */
} TransactionStmt; } TransactionStmt;