]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix XID list support some more
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 13 Jul 2022 08:34:54 +0000 (10:34 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 13 Jul 2022 08:34:54 +0000 (10:34 +0200)
Read/out support in 5ca0fe5c8ad7 was missing/incomplete, per Tom Lane.
Again, as far as core is concerned, this is not only dead code but also
untested; however, third parties may come to rely on it, so the standard
features should work.

Discussion: https://postgr.es/m/1548311.1657636605@sss.pgh.pa.us

src/backend/nodes/outfuncs.c
src/backend/nodes/read.c

index 4d776e7b51b0f670b3a74e4222e68e499bf1f61c..9e43fec86d4484f2b179e28a097e2d23b1bca8e6 100644 (file)
@@ -833,7 +833,8 @@ outNode(StringInfo str, const void *obj)
 
        if (obj == NULL)
                appendStringInfoString(str, "<>");
-       else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList))
+       else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) ||
+                        IsA(obj, XidList))
                _outList(str, obj);
        /* nodeRead does not want to see { } around these! */
        else if (IsA(obj, Integer))
index 1e61fde636777a0fb486ec2176a087fd2b77ab9b..4a54996b63f52f6772263f22cbe44ed133affde1 100644 (file)
@@ -304,7 +304,7 @@ nodeTokenType(const char *token, int length)
  *     * Value token nodes (integers, floats, booleans, or strings);
  *     * General nodes (via parseNodeString() from readfuncs.c);
  *     * Lists of the above;
- *     * Lists of integers or OIDs.
+ *     * Lists of integers, OIDs, or TransactionIds.
  * The return value is declared void *, not Node *, to avoid having to
  * cast it explicitly in callers that assign to fields of different types.
  *
@@ -346,6 +346,7 @@ nodeRead(const char *token, int tok_len)
                                /*----------
                                 * Could be an integer list:    (i int int ...)
                                 * or an OID list:                              (o int int ...)
+                                * or an XID list:                              (x int int ...)
                                 * or a list of nodes/values:   (node node ...)
                                 *----------
                                 */
@@ -392,6 +393,26 @@ nodeRead(const char *token, int tok_len)
                                                l = lappend_oid(l, val);
                                        }
                                }
+                               else if (tok_len == 1 && token[0] == 'x')
+                               {
+                                       /* List of TransactionIds */
+                                       for (;;)
+                                       {
+                                               TransactionId val;
+                                               char       *endptr;
+
+                                               token = pg_strtok(&tok_len);
+                                               if (token == NULL)
+                                                       elog(ERROR, "unterminated List structure");
+                                               if (token[0] == ')')
+                                                       break;
+                                               val = (TransactionId) strtoul(token, &endptr, 10);
+                                               if (endptr != token + tok_len)
+                                                       elog(ERROR, "unrecognized Xid: \"%.*s\"",
+                                                                tok_len, token);
+                                               l = lappend_xid(l, val);
+                                       }
+                               }
                                else
                                {
                                        /* List of other node types */