Re: making the backend's json parser work in frontend code
Robert Haas <robertmhaas@gmail.com>
From: Robert Haas <robertmhaas@gmail.com>
To: Andres Freund <andres@anarazel.de>
Cc: "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2020-01-16T02:39:13Z
Lists: pgsql-hackers
On Wed, Jan 15, 2020 at 6:40 PM Andres Freund <andres@anarazel.de> wrote: > It's not obvious why the better approach here wouldn't be to just have a > very simple ereport replacement, that needs to be explicitly included > from frontend code. It'd not be meaningfully harder, imo, and it'd > require fewer adaptions, and it'd look more familiar. I agree that it's far from obvious that the hacks in the patch are best; to the contrary, they are hacks. That said, I feel that the semantics of throwing an error are not very well-defined in a front-end environment. I mean, in a backend context, throwing an error is going to abort the current transaction, with all that this implies. If the frontend equivalent is to do nothing and hope for the best, I doubt it will survive anything more than the simplest use cases. This is one of the reasons I've been very reluctant to go do down this whole path in the first place. > > +#ifdef FRONTEND > > + lex->token_terminator = s + PQmblen(s, PG_UTF8); > > +#else > > lex->token_terminator = s + pg_mblen(s); > > +#endif > > If we were to go this way, it seems like the ifdef should rather be in a > helper function, rather than all over. Sure... like I said, this is just to illustrate the problem. > It seems like it should be > unproblematic to have a common interface for both frontend/backend? Not sure how. pg_mblen() and PQmblen() are both existing interfaces, and they're not compatible with each other. I guess we could make PQmblen() available to backend code, but given that the function name implies an origin in libpq, that seems wicked confusing. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Add jsonapi.c to Mkvcbuild.pm's @pgcommonallfiles.
- 006b9dcad419 13.0 landed
-
Move jsonapi.c and jsonapi.h to src/common.
- beb4699091e9 13.0 landed
-
Move some code from jsonapi.c to jsonfuncs.c.
- 73ce2a03f30b 13.0 landed
-
Adjust pg_parse_json() so that it does not directly ereport().
- 1f3a021730be 13.0 landed
-
Remove jsonapi.c's lex_accept().
- 530609aa4263 13.0 landed
-
Split JSON lexer/parser from 'json' data type support.
- 11b5e3e35d39 13.0 landed
-
Rationalize code placement between wchar.c, encnames.c, and mbutils.c.
- 5afaa2e42655 13.0 landed
-
Move wchar.c and encnames.c to src/common/.
- e6afa8918c46 13.0 landed
-
Update header comments for wchar.c and encnames.c.
- 3d4cb5d6c180 13.0 landed
-
Make StringInfo available to frontend code.
- 26aaf97b683d 13.0 cited
-
Use SASLprep to normalize passwords for SCRAM authentication.
- 60f11b87a234 10.0 cited