565{
566 JsonbIterator *it;
567 JsonbValue v;
568 bool skipNested = false;
569 JsonbIteratorToken
r;
570 uint32_t k;
571
572 if (!JB_ROOT_IS_OBJECT(jb))
573 return tags;
574
575 it = JsonbIteratorInit(&jb->root);
576
577 while ((
r = JsonbIteratorNext(&it, &v, skipNested)) != WJB_DONE)
578 {
579 skipNested = true;
580
581 if (
r == WJB_KEY && v.type != jbvNull)
582 {
583
586 {
587 char *key;
589
590 key = palloc(v.val.string.len + 1);
591 memcpy(key, v.val.string.val, v.val.string.len);
592 key[v.val.string.len] = '\0';
593
594 tags = repalloc(tags, newSize * 2 * sizeof(*tags));
596 }
597
598 r = JsonbIteratorNext(&it, &v, skipNested);
599
600 if (v.type == jbvString)
601 {
603 value = palloc(v.val.string.len + 1);
604 memcpy(value, v.val.string.val, v.val.string.len);
605 value[v.val.string.len] =
'\0';
608 }
609 else if (v.type == jbvBool)
610 {
612 bool_values_hash, bool_value, sizeof(protobuf_c_boolean));
614 }
615 else if (v.type == jbvNumeric)
616 {
618 double d;
619 long l;
620 str = DatumGetCString(DirectFunctionCall1(numeric_out,
621 PointerGetDatum(v.val.numeric)));
622 d = strtod(
str, NULL);
623 l = strtol(
str, NULL, 10);
624
625 if (fabs(d - (double)l) > FLT_EPSILON)
626 {
628 double_value, sizeof(double));
629 }
630 else
631 {
633 }
635 }
636 }
637 }
638
639 return tags;
640}
static uint32_t get_key_index_with_size(mvt_agg_context *ctx, const char *name, size_t size)
#define MVT_PARSE_INT_VALUE(value)
static uint32_t add_key(mvt_agg_context *ctx, char *name)
static void add_value_as_string(mvt_agg_context *ctx, char *value, uint32_t *tags, uint32_t k)
#define MVT_PARSE_VALUE(value, kvtype, hash, valuefield, size)