Re: WIP Incremental JSON Parser
Andrew Dunstan <andrew@dunslane.net>
From: Andrew Dunstan <andrew@dunslane.net>
To: Jacob Champion <jacob.champion@enterprisedb.com>
Cc: Robert Haas <robertmhaas@gmail.com>, Peter Smith <smithpb2250@gmail.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2024-03-29T16:42:16Z
Lists: pgsql-hackers
Attachments
- v14-0001-Introduce-a-non-recursive-JSON-parser.patch (text/x-patch) patch v14-0001
- v14-0002-Add-support-for-incrementally-parsing-backup-man.patch (text/x-patch) patch v14-0002
- v14-0003-Use-incremental-parsing-of-backup-manifests.patch (text/x-patch) patch v14-0003
- v14-0004-add-test-for-semantic-actions-of-the-incremental.patch (text/x-patch) patch v14-0004
On 2024-03-25 Mo 19:02, Andrew Dunstan wrote:
>
>
> On Mon, Mar 25, 2024 at 6:15 PM Jacob Champion
> <jacob.champion@enterprisedb.com> wrote:
>
> On Wed, Mar 20, 2024 at 11:56 PM Andrew Dunstan
> <andrew@dunslane.net> wrote:
> > Thanks, included that and attended to the other issues we
> discussed. I think this is pretty close now.
>
> Okay, looking over the thread, there are the following open items:
> - extend the incremental test in order to exercise the semantic
> callbacks [1]
>
>
>
> Yeah, I'm on a super long plane trip later this week, so I might get
> it done then :-)
>
> - add Assert calls in impossible error cases [2]
>
>
> ok, will do
>
> - error out if the non-incremental lex doesn't consume the entire
> token [2]
>
>
> ok, will do
>
> - double-check that out of memory is an appropriate failure mode for
> the frontend [3]
>
>
>
> Well, what's the alternative? The current parser doesn't check stack
> depth in frontend code. Presumably it too will eventually just run out
> of memory, possibly rather sooner as the stack frames could be more
> expensive than the incremental parser stack extensions.
>
>
> Just as a general style nit:
>
> > + if (lex->incremental)
> > + {
> > + lex->input = lex->token_terminator = lex->line_start = json;
> > + lex->input_length = len;
> > + lex->inc_state->is_last_chunk = is_last;
> > + }
> > + else
> > + return JSON_INVALID_LEXER_TYPE;
>
> I think flipping this around would probably make it more readable;
> something like:
>
> if (!lex->incremental)
> return JSON_INVALID_LEXER_TYPE;
>
> lex->input = ...
>
>
>
> Noted. will do, Thanks.
>
>
Here's a new set of patches, with I think everything except the error
case Asserts attended to. There's a change to add semantic processing to
the test suite in patch 4, but I'd fold that into patch 1 when committing.
cheers
andrew
--
Andrew Dunstan
EDB:https://www.enterprisedb.com
Commits
-
Post review fixes for test_json_parser test module
- ba3e6e2bca97 17.0 landed
-
Shrink test file for test_json_parser module
- b8a7bfa33324 17.0 landed
-
Add support for incrementally parsing backup manifests
- ea7b4e9a2a7c 17.0 landed
-
Introduce a non-recursive JSON parser
- 3311ea86edc7 17.0 landed
-
Use incremental parsing of backup manifests.
- 222e11a10ae9 17.0 landed