postgres.git / summary / log / commit / refs

commit    2cb1a5a8d4aeb63da2d6a2d22169f05c60bb5828
Author:   Peter Eisentraut <peter@eisentraut.org>
Date:     Sat Sep 24 22:10:52 2022 +0000
First released in: 16.0

    Fix reading of BitString nodes
    
    The node tokenizer went out of its way to store BitString node values
    without the leading 'b'.  But everything else in the system stores the
    leading 'b'.  This would break if a BitString node is
    read-printed-read.
    
    Also, the node tokenizer didn't know that BitString node tokens could
    also start with 'x'.
    
    Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://www.postgresql.org/message-id/flat/4159834.1657405226@sss.pgh.pa.us


src/backend/nodes/read.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index a9cb81b1290..fe84f140eef 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -288,7 +288,7 @@ nodeTokenType(const char *token, int length) retval = T_Boolean; else if (*token == '"' && length > 1 && token[length - 1] == '"') retval = T_String; - else if (*token == 'b') + else if (*token == 'b' || *token == 'x') retval = T_BitString; else retval = OTHER_TOKEN; @@ -471,11 +471,10 @@ nodeRead(const char *token, int tok_len) break; case T_BitString: { - char *val = palloc(tok_len); + char *val = palloc(tok_len + 1); - /* skip leading 'b' */ - memcpy(val, token + 1, tok_len - 1); - val[tok_len - 1] = '\0'; + memcpy(val, token, tok_len); + val[tok_len] = '\0'; result = (Node *) makeBitString(val); break; } [parent: 43f4b349152d]