Simplify parse representation of savepoint commands
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 17 Feb 2018 01:57:06 +0000 (20:57 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 16 Mar 2018 17:18:06 +0000 (13:18 -0400)
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>
src/backend/access/transam/xact.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/parser/gram.y
src/backend/tcop/utility.c
src/include/access/xact.h
src/include/nodes/parsenodes.h

index 49d4decc71083bab42e7559c0f7e0e0a8cf3c715..d16102a1e4dd22c6f2dd1c463577478596660207 100644 (file)
@@ -3908,13 +3908,11 @@ DefineSavepoint(const char *name)
  * As above, we don't actually do anything here except change blockState.
  */
 void
-ReleaseSavepoint(List *options)
+ReleaseSavepoint(const char *name)
 {
    TransactionState s = CurrentTransactionState;
    TransactionState target,
                xact;
-   ListCell   *cell;
-   char       *name = NULL;
 
    /*
     * Workers synchronize transaction state at the beginning of each parallel
@@ -3978,16 +3976,6 @@ ReleaseSavepoint(List *options)
            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)
    {
        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.
  */
 void
-RollbackToSavepoint(List *options)
+RollbackToSavepoint(const char *name)
 {
    TransactionState s = CurrentTransactionState;
    TransactionState target,
                xact;
-   ListCell   *cell;
-   char       *name = NULL;
 
    /*
     * Workers synchronize transaction state at the beginning of each parallel
@@ -4099,16 +4085,6 @@ RollbackToSavepoint(List *options)
            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)
    {
        if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)
index f84da801c6d27c212bae8bf95dcff7a8432e5d93..3ad4da64aafd8ce4ada56652ddf2009dfb826968 100644 (file)
@@ -3602,6 +3602,7 @@ _copyTransactionStmt(const TransactionStmt *from)
 
    COPY_SCALAR_FIELD(kind);
    COPY_NODE_FIELD(options);
+   COPY_STRING_FIELD(savepoint_name);
    COPY_STRING_FIELD(gid);
 
    return newnode;
index ee8d925db14daa9bb0337b19e9f333ac3abfff69..765b1be74b342a2acdc50d360392392d7117f45e 100644 (file)
@@ -1513,6 +1513,7 @@ _equalTransactionStmt(const TransactionStmt *a, const TransactionStmt *b)
 {
    COMPARE_SCALAR_FIELD(kind);
    COMPARE_NODE_FIELD(options);
+   COMPARE_STRING_FIELD(savepoint_name);
    COMPARE_STRING_FIELD(gid);
 
    return true;
index 06c03dff3cea1b69fe15322cd87f86ece9597cb1..cd5ba2d4d8d47acc40c0daa9a25a5b041fec67dc 100644 (file)
@@ -9876,40 +9876,35 @@ TransactionStmt:
                {
                    TransactionStmt *n = makeNode(TransactionStmt);
                    n->kind = TRANS_STMT_SAVEPOINT;
-                   n->options = list_make1(makeDefElem("savepoint_name",
-                                                       (Node *)makeString($2), @1));
+                   n->savepoint_name = $2;
                    $$ = (Node *)n;
                }
            | RELEASE SAVEPOINT ColId
                {
                    TransactionStmt *n = makeNode(TransactionStmt);
                    n->kind = TRANS_STMT_RELEASE;
-                   n->options = list_make1(makeDefElem("savepoint_name",
-                                                       (Node *)makeString($3), @1));
+                   n->savepoint_name = $3;
                    $$ = (Node *)n;
                }
            | RELEASE ColId
                {
                    TransactionStmt *n = makeNode(TransactionStmt);
                    n->kind = TRANS_STMT_RELEASE;
-                   n->options = list_make1(makeDefElem("savepoint_name",
-                                                       (Node *)makeString($2), @1));
+                   n->savepoint_name = $2;
                    $$ = (Node *)n;
                }
            | ROLLBACK opt_transaction TO SAVEPOINT ColId
                {
                    TransactionStmt *n = makeNode(TransactionStmt);
                    n->kind = TRANS_STMT_ROLLBACK_TO;
-                   n->options = list_make1(makeDefElem("savepoint_name",
-                                                       (Node *)makeString($5), @1));
+                   n->savepoint_name = $5;
                    $$ = (Node *)n;
                }
            | ROLLBACK opt_transaction TO ColId
                {
                    TransactionStmt *n = makeNode(TransactionStmt);
                    n->kind = TRANS_STMT_ROLLBACK_TO;
-                   n->options = list_make1(makeDefElem("savepoint_name",
-                                                       (Node *)makeString($4), @1));
+                   n->savepoint_name = $4;
                    $$ = (Node *)n;
                }
            | PREPARE TRANSACTION Sconst
index 81881be1d515822f3742cf8386e7697aeba79b33..ed55521a0cdd027fa24d390cbbd46dc29c530c7d 100644 (file)
@@ -469,34 +469,18 @@ standard_ProcessUtility(PlannedStmt *pstmt,
                        break;
 
                    case TRANS_STMT_SAVEPOINT:
-                       {
-                           ListCell   *cell;
-                           char       *name = NULL;
-
-                           RequireTransactionBlock(isTopLevel, "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);
-                       }
+                       RequireTransactionBlock(isTopLevel, "SAVEPOINT");
+                       DefineSavepoint(stmt->savepoint_name);
                        break;
 
                    case TRANS_STMT_RELEASE:
                        RequireTransactionBlock(isTopLevel, "RELEASE SAVEPOINT");
-                       ReleaseSavepoint(stmt->options);
+                       ReleaseSavepoint(stmt->savepoint_name);
                        break;
 
                    case TRANS_STMT_ROLLBACK_TO:
                        RequireTransactionBlock(isTopLevel, "ROLLBACK TO SAVEPOINT");
-                       RollbackToSavepoint(stmt->options);
+                       RollbackToSavepoint(stmt->savepoint_name);
 
                        /*
                         * CommitTransactionCommand is in charge of
index 4a1307a4f01d748cb926154d60f554205c24f3ec..87ae2cd4df66cb916111683211d22d872cf744e0 100644 (file)
@@ -354,9 +354,9 @@ extern bool PrepareTransactionBlock(const char *gid);
 extern void UserAbortTransactionBlock(void);
 extern void BeginImplicitTransactionBlock(void);
 extern void EndImplicitTransactionBlock(void);
-extern void ReleaseSavepoint(List *options);
+extern void ReleaseSavepoint(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 ReleaseCurrentSubTransaction(void);
 extern void RollbackAndReleaseCurrentSubTransaction(void);
index f668cbad346f27ce3f3148be9c705f0554948d45..92082b3a7a21b02136f607a45a4d5a543c3251ed 100644 (file)
@@ -2966,7 +2966,8 @@ typedef struct TransactionStmt
 {
    NodeTag     type;
    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 */
 } TransactionStmt;