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:

`