Fix portability issue in new jsonbsubs code.

On machines where sizeof(Datum) > sizeof(Oid) (that is, any 64-bit
platform), the previous coding would compute a misaligned
workspace->index pointer if nupper is odd.  Architectures where
misaligned access is a hard no-no would then fail.  This appears
to explain why thorntail is unhappy but other buildfarm members
are not.
This commit is contained in:
Tom Lane 2021-02-01 02:03:59 -05:00
parent aa6e46daf5
commit 7c5d57caed

View File

@ -356,7 +356,7 @@ jsonb_subscript_fetch_old(ExprState *state,
static void
jsonb_exec_setup(const SubscriptingRef *sbsref,
SubscriptingRefState *sbsrefstate,
SubscriptExecSteps * methods)
SubscriptExecSteps *methods)
{
JsonbSubWorkspace *workspace;
ListCell *lc;
@ -368,9 +368,14 @@ jsonb_exec_setup(const SubscriptingRef *sbsref,
nupper * (sizeof(Datum) + sizeof(Oid)));
workspace->expectArray = false;
ptr = ((char *) workspace) + MAXALIGN(sizeof(JsonbSubWorkspace));
workspace->indexOid = (Oid *) ptr;
ptr += nupper * sizeof(Oid);
/*
* This coding assumes sizeof(Datum) >= sizeof(Oid), else we might
* misalign the indexOid pointer
*/
workspace->index = (Datum *) ptr;
ptr += nupper * sizeof(Datum);
workspace->indexOid = (Oid *) ptr;
sbsrefstate->workspace = workspace;