![]() |
MySQL 9.4.0
Source Code Documentation
|
This file specifies the interface for serializing JSON values into binary representation, and for reading values back from the binary representation. More...
#include <stddef.h>#include <cassert>#include <cstdint>#include <string>#include <string_view>#include "field_types.h"#include "sql-common/json_error_handler.h"Go to the source code of this file.
Classes | |
| class | json_binary::Value |
| Class used for reading JSON values that are stored in the binary format. More... | |
Namespaces | |
| namespace | json_binary |
Macros | |
| #define | EXPORT_JSON_FUNCTION |
Functions | |
| void | json_binary::write_offset_or_size (char *dest, size_t offset_or_size, bool large) |
| Write an offset or a size to a char array. More... | |
| bool | json_binary::append_offset_or_size (String *dest, size_t offset_or_size, bool large) |
| Append an offset or a size to a String. More... | |
| bool | json_binary::append_int16 (String *dest, int16_t value) |
| Encode a 16-bit int at the end of the destination string. More... | |
| bool | json_binary::attempt_inline_value (const Json_dom *value, String *dest, size_t pos, bool large) |
| Attempt to inline a value in its value entry at the beginning of an object or an array. More... | |
| uint32_t | json_binary::read_offset_or_size (const char *data, bool large) |
| Read an offset or size field from a buffer. More... | |
| bool | json_binary::inlined_type (uint8_t type, bool large) |
| Will a value of the specified type be inlined? More... | |
| uint8_t | json_binary::offset_size (bool large) |
| Get the size of an offset value. More... | |
| uint8_t | json_binary::key_entry_size (bool large) |
| Get the size of a key entry. More... | |
| uint8_t | json_binary::value_entry_size (bool large) |
| Get the size of a value entry. More... | |
| bool | json_binary::serialize (const Json_dom *dom, const JsonSerializationErrorHandler &error_handler, String *dest) |
| Serialize the JSON document represented by dom to binary format in the destination string, replacing any content already in the destination string. More... | |
| Value | json_binary::parse_binary (const char *data, size_t len) |
| Parse a JSON binary document. More... | |
| bool | json_binary::space_needed (const Json_wrapper *value, bool large, size_t *needed) |
| How much space is needed for a JSON value when it is stored in the binary format. More... | |
| template<typename Func > | |
| bool | json_binary::for_each_node (const Value &value, const Func &func) |
| Apply a function to every value in a JSON document. More... | |
Variables | |
| constexpr char | json_binary::JSONB_TYPE_SMALL_OBJECT = 0x0 |
| constexpr char | json_binary::JSONB_TYPE_LARGE_OBJECT = 0x1 |
| constexpr char | json_binary::JSONB_TYPE_SMALL_ARRAY = 0x2 |
| constexpr char | json_binary::JSONB_TYPE_LARGE_ARRAY = 0x3 |
| constexpr char | json_binary::JSONB_TYPE_LITERAL = 0x4 |
| constexpr char | json_binary::JSONB_TYPE_INT16 = 0x5 |
| constexpr char | json_binary::JSONB_TYPE_UINT16 = 0x6 |
| constexpr char | json_binary::JSONB_TYPE_INT32 = 0x7 |
| constexpr char | json_binary::JSONB_TYPE_UINT32 = 0x8 |
| constexpr char | json_binary::JSONB_TYPE_INT64 = 0x9 |
| constexpr char | json_binary::JSONB_TYPE_UINT64 = 0xA |
| constexpr char | json_binary::JSONB_TYPE_DOUBLE = 0xB |
| constexpr char | json_binary::JSONB_TYPE_STRING = 0xC |
| constexpr char | json_binary::JSONB_TYPE_OPAQUE = 0xF |
| constexpr char | json_binary::JSONB_NULL_LITERAL = 0x0 |
| constexpr char | json_binary::JSONB_TRUE_LITERAL = 0x1 |
| constexpr char | json_binary::JSONB_FALSE_LITERAL = 0x2 |
This file specifies the interface for serializing JSON values into binary representation, and for reading values back from the binary representation.
The binary format is as follows:
Each JSON value (scalar, object or array) has a one byte type identifier followed by the actual value.
If the value is a JSON object, its binary representation will have a header that contains:
The actual keys and values will come after the header, in the same order as in the header.
Similarly, if the value is a JSON array, the binary representation will have a header with
followed by the actual values, in the same order as in the header.
doc ::= type value
type ::=
0x00 | // small JSON object
0x01 | // large JSON object
0x02 | // small JSON array
0x03 | // large JSON array
0x04 | // literal (true/false/null)
0x05 | // int16
0x06 | // uint16
0x07 | // int32
0x08 | // uint32
0x09 | // int64
0x0a | // uint64
0x0b | // double
0x0c | // utf8mb4 string
0x0f // custom data (any MySQL data type)
value ::=
object |
array |
literal |
number |
string |
custom-data
object ::= element-count size key-entry* value-entry* key* value*
array ::= element-count size value-entry* value*
// number of members in object or number of elements in array
element-count ::=
uint16 | // if used in small JSON object/array
uint32 // if used in large JSON object/array
// number of bytes in the binary representation of the object or array
size ::=
uint16 | // if used in small JSON object/array
uint32 // if used in large JSON object/array
key-entry ::= key-offset key-length
key-offset ::=
uint16 | // if used in small JSON object
uint32 // if used in large JSON object
key-length ::= uint16 // key length must be less than 64KB
value-entry ::= type offset-or-inlined-value
// This field holds either the offset to where the value is stored,
// or the value itself if it is small enough to be inlined (that is,
// if it is a JSON literal or a small enough [u]int).
offset-or-inlined-value ::=
uint16 | // if used in small JSON object/array
uint32 // if used in large JSON object/array
key ::= utf8mb4-data
literal ::=
0x00 | // JSON null literal
0x01 | // JSON true literal
0x02 | // JSON false literal
number ::= .... // little-endian format for [u]int(16|32|64), whereas
// double is stored in a platform-independent, eight-byte
// format using float8store()
string ::= data-length utf8mb4-data
custom-data ::= custom-type data-length binary-data
custom-type ::= uint8 // type identifier that matches the
// internal enum_field_types enum
data-length ::= uint8* // If the high bit of a byte is 1, the length
// field is continued in the next byte,
// otherwise it is the last byte of the length
// field. So we need 1 byte to represent
// lengths up to 127, 2 bytes to represent
// lengths up to 16383, and so on...
| #define EXPORT_JSON_FUNCTION |