Bug#23031146: INSERTING 64K SIZE RECORDS TAKE TOO MUCH TIME · mysql/mysql-server@a2f9ea4 (original) (raw)
1
``
`-
/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
`
``
1
`+
/* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
`
2
2
``
3
3
` This program is free software; you can redistribute it and/or modify
`
4
4
` it under the terms of the GNU General Public License as published by
`
`@@ -91,7 +91,7 @@ enum enum_serialization_result
`
91
91
``
92
92
`static enum_serialization_result
`
93
93
`serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
94
``
`-
size_t depth);
`
``
94
`+
size_t depth, bool small_parent);
`
95
95
``
96
96
`bool serialize(const Json_dom *dom, String *dest)
`
97
97
`{
`
`@@ -102,7 +102,7 @@ bool serialize(const Json_dom *dom, String *dest)
`
102
102
`// Reserve space (one byte) for the type identifier.
`
103
103
`if (dest->append('\0'))
`
104
104
`return true; /* purecov: inspected */
`
105
``
`-
return serialize_json_value(dom, 0, dest, 0) != OK;
`
``
105
`+
return serialize_json_value(dom, 0, dest, 0, false) != OK;
`
106
106
`}
`
107
107
``
108
108
``
`@@ -392,7 +392,7 @@ append_value(String *dest, const Json_dom *value, size_t start_pos,
`
392
392
`return VALUE_TOO_BIG;
`
393
393
``
394
394
`insert_offset_or_size(dest, entry_pos + 1, offset, large);
`
395
``
`-
return serialize_json_value(value, entry_pos, dest, depth);
`
``
395
`+
return serialize_json_value(value, entry_pos, dest, depth, !large);
`
396
396
`}
`
397
397
``
398
398
``
`@@ -580,11 +580,14 @@ serialize_json_object(const Json_object *object, String *dest, bool large,
`
580
580
` @param type_pos the position of the type specifier to update
`
581
581
` @param dest the destination string
`
582
582
` @param depth the current nesting level
`
``
583
`+
@param small_parent
`
``
584
`+
tells if @a dom is contained in an array or object
`
``
585
`+
which is stored in the small storage format
`
583
586
` @return serialization status
`
584
587
`*/
`
585
588
`static enum_serialization_result
`
586
589
`serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
587
``
`-
size_t depth)
`
``
590
`+
size_t depth, bool small_parent)
`
588
591
`{
`
589
592
`const size_t start_pos= dest->length();
`
590
593
`DBUG_ASSERT(type_pos < start_pos);
`
`@@ -609,6 +612,9 @@ serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
609
612
`*/
`
610
613
`if (result == VALUE_TOO_BIG)
`
611
614
` {
`
``
615
`+
// If the parent uses the small storage format, it needs to grow too.
`
``
616
`+
if (small_parent)
`
``
617
`+
return VALUE_TOO_BIG;
`
612
618
` dest->length(start_pos);
`
613
619
` (*dest)[type_pos]= JSONB_TYPE_LARGE_ARRAY;
`
614
620
` result= serialize_json_array(array, dest, true, depth);
`
`@@ -631,6 +637,9 @@ serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
631
637
`*/
`
632
638
`if (result == VALUE_TOO_BIG)
`
633
639
` {
`
``
640
`+
// If the parent uses the small storage format, it needs to grow too.
`
``
641
`+
if (small_parent)
`
``
642
`+
return VALUE_TOO_BIG;
`
634
643
` dest->length(start_pos);
`
635
644
` (*dest)[type_pos]= JSONB_TYPE_LARGE_OBJECT;
`
636
645
` result= serialize_json_object(object, dest, true, depth);
`
`@@ -746,7 +755,7 @@ serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
746
755
`if (jd->get_binary(buf))
`
747
756
`return FAILURE; /* purecov: inspected */
`
748
757
` Json_opaque o(MYSQL_TYPE_NEWDECIMAL, buf, bin_size);
`
749
``
`-
result= serialize_json_value(&o, type_pos, dest, depth);
`
``
758
`+
result= serialize_json_value(&o, type_pos, dest, depth, small_parent);
`
750
759
`break;
`
751
760
` }
`
752
761
`case Json_dom::J_DATETIME:
`
`@@ -759,7 +768,7 @@ serialize_json_value(const Json_dom *dom, size_t type_pos, String *dest,
`
759
768
`char buf[Json_datetime::PACKED_SIZE];
`
760
769
` jdt->to_packed(buf);
`
761
770
` Json_opaque o(jdt->field_type(), buf, Json_datetime::PACKED_SIZE);
`
762
``
`-
result= serialize_json_value(&o, type_pos, dest, depth);
`
``
771
`+
result= serialize_json_value(&o, type_pos, dest, depth, small_parent);
`
763
772
`break;
`
764
773
` }
`
765
774
`default:
`