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;