v4-0002-Build-json-strings-in-larger-chunks-during-lexing.patch
text/x-patch
Filename: v4-0002-Build-json-strings-in-larger-chunks-during-lexing.patch
Type: text/x-patch
Part: 3
Patch
Format: format-patch
Series: patch v4-0002
Subject: Build json strings in larger chunks during lexing
| File | + | − |
|---|---|---|
| src/common/jsonapi.c | 17 | 1 |
From 03d3be083ba60d272e848b3ec96db3c6d47a3b06 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
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