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




--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to