wrapItem() didn't wrap objects properly #2
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
jbv will be passed to pushJsonbValue() and from there to pushJsonbValueScalar(). The latter in assert-enabled builds insists that jbv is a scalar in case of WJB_ELEM which is intended for scalars that are wrapped between WJB_BEGIN_ARRAY and WJB_END_ARRAY. Therefore if jbv is an object, it needs to be wrapped in a binary form so that pushJsonbValue() will call pushJsonbValueScalar() with the right token (WJB_BEGIN_OBJECT).
This enables proper execution of queries like SELECT JSON_QUERY(jsonb '{}', '{"a":"b"}[*]') in assert-enabled builds. In non-assert-enabled builds it appears to have worked, but perhaps only by accident.
In this particular case, the wrapping is needed to implement the fact that the standard allows subscript path steps to be applied to non-arrays in lax mode. This should be documented somewhere, probably in form of a comment (perhaps right above wrapItem() definition), but I don't know yet if there are any other reasons for this kind of wrapping to happen so I don't want to write a comment which is potentially half-true.