Fix XID list support some more

Read/out support in 5ca0fe5c8a 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
This commit is contained in:
Alvaro Herrera 2022-07-13 10:34:54 +02:00
parent 58b4f366c0
commit 7057bf2354
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
2 changed files with 24 additions and 2 deletions

View 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))

View 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 */