Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 273abbd

Browse files
committed
Fix decompression
1 parent 4f38b03 commit 273abbd

File tree

2 files changed

+94
-123
lines changed

2 files changed

+94
-123
lines changed

jsonbc.c

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static void encode_varbyte(uint32 val, unsigned char *ptr, int *len);
7171
static uint32 decode_varbyte(unsigned char *ptr);
7272
static char *packJsonbValue(JsonbValue *val, int header_size, int *len);
7373
static void setup_guc_variables(void);
74-
static void jsonbc_get_keys(Oid cmoptoid, uint32 *ids, int nkeys, char **keys);
74+
static char *jsonbc_get_keys(Oid cmoptoid, uint32 *ids, int nkeys, size_t *buflen);
7575
static void jsonbc_get_key_ids(Oid cmoptoid, char *buf, int buflen, uint32 *idsbuf, int nkeys);
7676

7777
static size_t
@@ -278,16 +278,13 @@ ids_callback(char *res, size_t reslen, void *arg)
278278

279279
typedef struct
280280
{
281-
char **keys;
282-
int nkeys;
281+
size_t buflen;
282+
char *buf;
283283
} keys_callback_state;
284284

285285
static bool
286286
keys_callback(char *res, size_t reslen, void *arg)
287287
{
288-
int i = 0,
289-
nkeys = 0;
290-
291288
keys_callback_state *state = (keys_callback_state *) arg;
292289

293290
/* it should at least two symbols in the response */
@@ -302,16 +299,13 @@ keys_callback(char *res, size_t reslen, void *arg)
302299
compression_buffers->buflen = reslen;
303300
}
304301

302+
/* save the received data */
305303
memcpy(compression_buffers->buf, res, reslen);
306304

307-
while (reslen--)
308-
{
309-
if (res[i] != '\0')
310-
state->keys[nkeys++] = &compression_buffers->buf[i];
311-
i++;
312-
}
305+
state->buf = compression_buffers->buf;
306+
state->buflen = reslen;
313307

314-
return (nkeys == state->nkeys);
308+
return true;
315309
}
316310

317311
static void
@@ -392,13 +386,13 @@ jsonbc_get_key_ids(Oid cmoptoid, char *buf, int buflen, uint32 *idsbuf, int nkey
392386
ids_callback_state state;
393387

394388
iov[0].data = (void *) &nkeys;
395-
iov[0].len = sizeof(int);
389+
iov[0].len = sizeof(nkeys);
396390

397391
iov[1].data = (void *) &cmoptoid;
398-
iov[1].len = sizeof(Oid);
392+
iov[1].len = sizeof(cmoptoid);
399393

400394
iov[2].data = (void *) &cmd;
401-
iov[2].len = sizeof(JsonbcCommand);
395+
iov[2].len = sizeof(cmd);
402396

403397
iov[3].data = buf;
404398
iov[3].len = buflen;
@@ -409,28 +403,31 @@ jsonbc_get_key_ids(Oid cmoptoid, char *buf, int buflen, uint32 *idsbuf, int nkey
409403
}
410404

411405
/* Get keys by their IDs using workers */
412-
static void
413-
jsonbc_get_keys(Oid cmoptoid, uint32 *ids, int nkeys, char **keys)
406+
static char *
407+
jsonbc_get_keys(Oid cmoptoid, uint32 *ids, int nkeys, size_t *buflen)
414408
{
415409
JsonbcCommand cmd = JSONBC_CMD_GET_KEYS;
416410
shm_mq_iovec iov[4];
417411
keys_callback_state state;
418412

419413
iov[0].data = (void *) &nkeys;
420-
iov[0].len = sizeof(int);
414+
iov[0].len = sizeof(nkeys);
421415

422416
iov[1].data = (void *) &cmoptoid;
423-
iov[1].len = sizeof(Oid);
417+
iov[1].len = sizeof(cmoptoid);
424418

425419
iov[2].data = (void *) &cmd;
426-
iov[2].len = sizeof(JsonbcCommand);
420+
iov[2].len = sizeof(cmd);
427421

428422
iov[3].data = (char *) ids;
429423
iov[3].len = sizeof(uint32) * nkeys;
430424

431-
state.keys = keys;
432-
state.nkeys = nkeys;
425+
state.buf = NULL;
426+
state.buflen = 0;
433427
jsonbc_communicate(iov, 4, keys_callback, &state);
428+
429+
*buflen = state.buflen;
430+
return state.buf;
434431
}
435432

436433
/*
@@ -698,7 +695,7 @@ jsonbc_decompress(AttributeCompression *ac, const struct varlena *data)
698695
JsonbParseState *state = NULL;
699696
struct varlena *res;
700697

701-
init_memory_context(false);
698+
init_memory_context(true);
702699
Assert(VARATT_IS_CUSTOM_COMPRESSED(data));
703700

704701
jb = (Jsonb *) ((char *) data + VARHDRSZ_CUSTOM_COMPRESSED - offsetof(Jsonb, root));
@@ -709,7 +706,9 @@ jsonbc_decompress(AttributeCompression *ac, const struct varlena *data)
709706

710707
if (r == WJB_END_OBJECT && jbv->type == jbvObject)
711708
{
712-
char **keys;
709+
char *buf;
710+
size_t buflen,
711+
offset = 0;
713712
int i,
714713
nkeys = jbv->val.object.nPairs;
715714

@@ -721,7 +720,7 @@ jsonbc_decompress(AttributeCompression *ac, const struct varlena *data)
721720
compression_buffers->idslen = nkeys;
722721
}
723722

724-
/* decode keys */
723+
/* decode key ids */
725724
for (i = 0; i < nkeys; i++)
726725
{
727726
int32 key_id;
@@ -733,18 +732,24 @@ jsonbc_decompress(AttributeCompression *ac, const struct varlena *data)
733732
compression_buffers->idsbuf[i] = key_id;
734733
}
735734

736-
/* retrieve or generate ids */
737-
keys = (char **) palloc(sizeof(char *) * nkeys);
738-
jsonbc_get_keys(ac->cmoptoid, compression_buffers->idsbuf, nkeys, keys);
735+
/* retrieve keys */
736+
buf = jsonbc_get_keys(ac->cmoptoid, compression_buffers->idsbuf, nkeys, &buflen);
737+
if (buf == NULL)
738+
elog(ERROR, "jsonbc: decompression error");
739739

740740
/* replace the encoded keys with real keys */
741741
for (i = 0; i < nkeys; i++)
742742
{
743+
size_t oldoff = offset;
744+
743745
JsonbValue *v = &jbv->val.object.pairs[i].key;
744-
v->val.string.val = keys[i];
745-
v->val.string.len = strlen(keys[i]);
746+
v->val.string.val = &buf[offset];
747+
while (buf[offset++] != '\0');
748+
v->val.string.len = offset - oldoff - 2;
746749
}
747-
pfree(keys);
750+
751+
/* check correctness */
752+
Assert(offset == buflen);
748753
}
749754
}
750755

0 commit comments

Comments
 (0)