From 03d3be083ba60d272e848b3ec96db3c6d47a3b06 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Fri, 1 Jul 2022 17:28:20 +0700 Subject: [PATCH v4 2/4] Build json strings in larger chunks during lexing Add lookahead loop to json_lex_string. This way, we can batch calls to appendBinaryStringInfo. Jelte Fennema and Andres Freund, with some adjustments by me Discussion: https://www.postgresql.org/message-id/CAGECzQQuXbies_nKgSiYifZUjBk6nOf2%3DTSXqRjj2BhUh8CTeA%40mail.gmail.com Discussion: https://www.postgresql.org/message-id/flat/PR3PR83MB0476F098CBCF68AF7A1CA89FF7B49@PR3PR83MB0476.EURPRD83.prod.outlook.com --- src/common/jsonapi.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c index eeedc0645a..ad4858c623 100644 --- a/src/common/jsonapi.c +++ b/src/common/jsonapi.c @@ -851,10 +851,26 @@ json_lex_string(JsonLexContext *lex) } else if (lex->strval != NULL) { + /* start lookahead at next byte */ + char *p = s + 1; + if (hi_surrogate != -1) return JSON_UNICODE_LOW_SURROGATE; - appendStringInfoChar(lex->strval, *s); + while (p < end) + { + if (*p == '\\' || *p == '"' || (unsigned char) *p < 32) + break; + p++; + } + + appendBinaryStringInfo(lex->strval, s, p - s); + + /* + * s will be incremented at the top of the loop, so set it to just + * behind our lookahead position + */ + s = p - 1; } } -- 2.36.1