On 2022-Jul-12, Tom Lane wrote: > What about outfuncs/readfuncs? I see that you fixed _outList, > but not its caller outNode: > > else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList)) > _outList(str, obj); > > and the LEFT_PAREN case in nodeRead() doesn't know what to do either.
Hmm, true -- naively grepping for OidList wasn't enough (moreso when I failed to notice one occurrence). This patch closes the holes you mentioned. I haven't found any others yet. -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/ "La vida es para el que se aventura"
>From d4dd486849c7c613dfc98cf0d7a3986dd0af4e25 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera <alvhe...@alvh.no-ip.org> Date: Tue, 12 Jul 2022 16:48:39 +0200 Subject: [PATCH] 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. Discussion: https://postgr.es/m/1548311.1657636...@sss.pgh.pa.us --- src/backend/nodes/outfuncs.c | 3 ++- src/backend/nodes/read.c | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 4d776e7b51..9e43fec86d 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -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)) diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 1e61fde636..4a54996b63 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -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 */ -- 2.30.2