Fix XID list support some more
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
This commit is contained in:
parent
58b4f366c0
commit
7057bf2354
@ -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))
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user