#35778: Use native JSONObject on Postgres 16+ with server side bindings
-------------------------------------+-------------------------------------
Reporter: john-parton | Type: New
| feature
Status: new | Component: Database
| layer (models, ORM)
Version: dev | Severity: Normal
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
JSONObject on Postgres 16 with server side bindings recently resulted in a
crash. The most recent fix is to fallback to the use of jsonb_build_object
on postgres 16 when using server side bindings.
See
https://code.djangoproject.com/ticket/35734
And
https://github.com/django/django/pull/18549
It is possible to use the native JSONObject with server side bindings, but
it requires a little bit of use of `cast`.
See <commit missing, was force-pushed overwritten at some point, need to
find it again>
There are two minor issues:
1. Should Postgres 16 *without* server-side bindings use "cast" even
though it's not strictly necessary? It it desirable or preferable to keep
the generated SQL the same when toggling the server-side binding feature?
I mentioned digging through logs as one example where it might matter.
2. Use of both cast and native json will require at least a minor change
to escaping. This is because we use the double-colon operator to cast and
the native json syntax uses a single colon to separate key-value pairs.
This creates a parsing ambiguity which results in a syntax error (on at
least one version of postgres). For solutions, they're all pretty similar
2a. Update the `as_native` function to wrap the keys in parenthesis,
effectively resolving the ambiguity. (This does raise yet another
question, a question within a question: should we go ahead and wrap the
keys in parenthesis on ALL backends? I think Oracle doesn't necessary
require that for example.)
2b. Update the Cast function to always wrap values in parenthesis in all
contexts. This seems like overkill.
2c. Change postgres from using the double-colon operator to the CAST(x AS
type) syntax. This also seems like overkill, and results in sql being
generated that is less postgres-y, if that makes sense.
--
Ticket URL: <
https://code.djangoproject.com/ticket/35778>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.