On 05/30/2014 11:08 AM, Andrew Dunstan wrote:
>
> On 05/30/2014 09:35 AM, Teodor Sigaev wrote:
>> Hi!
>>
>> jsonb operators ->text, ->>text,->int, ->>int use inefficient methods
>> to access to needed field, proportional O(N/2). Attached patch
>> suggests for text operators O(log(N)) and for integer - O(1). The
>> fuctions with fast access already are existed in current code and are
>> used in contains operation, for example. Attached patch uses that
>> functions instead of sequentual loop over object/array.
>
> Teodor, thanks for this.
>
> My only worry is this sort of code, which in a quick search I didn't
> find used elsewhere
>
> - (void) JsonbToCString(jtext, &tjb->root , -1);
> - result = cstring_to_text_with_len(jtext->data,
> jtext->len);
> + appendStringInfoSpaces(jtext, VARHDRSZ);
> + (void) JsonbToCString(jtext, v->val.binary.data,
> -1);
> +
> + result = (text*)jtext->data;
> + SET_VARSIZE(result, jtext->len);
>
>
> If we're going to construct varlena objects inside a StringInfo, maybe
> we need a proper API for it. Isn't there a danger that data member of
> the StringInfo won't be properly aligned to allow us to do this? In
> any case, we should get most of the benefit of your patch without this
> "optimization".
I see that palloc.h says:
The result of palloc() is always word-aligned
so maybe my alignment fear is misplaced. So my remaining question is
whether this is OK stylistically.
cheers
andrew