Skip to content
/ server Public
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 33 additions & 21 deletions sql/log_event.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@


#include "mariadb.h"
#include "mysql/psi/psi_base.h"
#include "sql_priv.h"
#include "handler.h"
#ifndef MYSQL_CLIENT
Expand Down Expand Up @@ -3722,13 +3723,13 @@ Table_map_log_event::~Table_map_log_event()
@param[in] field SIGNEDNESS field in table_map_event.
@param[in] length length of the field
*/
static void parse_signedness(std::vector<bool> &vec,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait a minute.
The implementation of C++ std::vector<bool> may specialize to use a bit array rather than a resizable array of bools (which typically occupy the space of a char each).
Dynamic_array<bool> isn’t also specialized AFAIA.

Reference: https://www.en.cppreference.com/w/cpp/container/vector_bool.html

static void parse_signedness(Dynamic_array<bool> &vec,
unsigned char *field, unsigned int length)
{
for (unsigned int i= 0; i < length; i++)
{
for (unsigned char c= 0x80; c != 0; c>>= 1)
vec.push_back(field[i] & c);
vec.append(field[i] & c);
}
}

Expand All @@ -3751,8 +3752,8 @@ static void parse_default_charset(Table_map_log_event::Optional_metadata_fields:
unsigned int col_index= net_field_length(&p);
unsigned int col_charset= net_field_length(&p);

default_charset.charset_pairs.push_back(std::make_pair(col_index,
col_charset));
default_charset.charset_pairs.append(std::make_pair(col_index,
col_charset));
}
}

Expand All @@ -3763,13 +3764,13 @@ static void parse_default_charset(Table_map_log_event::Optional_metadata_fields:
@param[in] field COLUMN_CHARSET field in table_map_event.
@param[in] length length of the field
*/
static void parse_column_charset(std::vector<unsigned int> &vec,
static void parse_column_charset(Dynamic_array<uint> &vec,
unsigned char *field, unsigned int length)
{
unsigned char* p= field;

while (p < field + length)
vec.push_back(net_field_length(&p));
vec.append(net_field_length(&p));
}

/**
Expand Down Expand Up @@ -3806,21 +3807,25 @@ static bool parse_column_name(MEM_ROOT *root, LEX_CSTRING *name,
@param[in] field COLUMN_NAME field in table_map_event.
@param[in] length length of the field
*/
static void parse_set_str_value(std::vector<Table_map_log_event::
Optional_metadata_fields::str_vector> &vec,
unsigned char *field, unsigned int length)
static void parse_set_str_value(
Dynamic_array<Table_map_log_event::Optional_metadata_fields::str_vector>
&vec,
unsigned char *field, unsigned int length)
{
unsigned char* p= field;

while (p < field + length)
{
unsigned int count= net_field_length(&p);

vec.push_back(std::vector<std::string>());
if (vec.reserve(vec.elements() + 1))
return;
vec.elements(vec.elements() + 1);
vec.back()->init(PSI_INSTRUMENT_MEM);
for (unsigned int i= 0; i < count; i++)
{
unsigned len1= net_field_length(&p);
vec.back().push_back(std::string(reinterpret_cast<char *>(p), len1));
vec.back()->append(LEX_CSTRING{reinterpret_cast<char *>(p), len1});
p+= len1;
}
}
Expand All @@ -3833,13 +3838,13 @@ static void parse_set_str_value(std::vector<Table_map_log_event::
@param[in] field GEOMETRY_TYPE field in table_map_event.
@param[in] length length of the field
*/
static void parse_geometry_type(std::vector<unsigned int> &vec,
static void parse_geometry_type(Dynamic_array<uint> &vec,
unsigned char *field, unsigned int length)
{
unsigned char* p= field;

while (p < field + length)
vec.push_back(net_field_length(&p));
vec.append(net_field_length(&p));
}

/**
Expand All @@ -3852,14 +3857,15 @@ static void parse_geometry_type(std::vector<unsigned int> &vec,
@param[in] field SIMPLE_PRIMARY_KEY field in table_map_event.
@param[in] length length of the field
*/
static void parse_simple_pk(std::vector<Table_map_log_event::
Optional_metadata_fields::uint_pair> &vec,
unsigned char *field, unsigned int length)
static void parse_simple_pk(
Dynamic_array<Table_map_log_event::Optional_metadata_fields::uint_pair>
&vec,
unsigned char *field, unsigned int length)
{
unsigned char* p= field;

while (p < field + length)
vec.push_back(std::make_pair(net_field_length(&p), 0));
vec.append(std::make_pair(net_field_length(&p), 0));
}

/**
Expand All @@ -3872,17 +3878,18 @@ static void parse_simple_pk(std::vector<Table_map_log_event::
@param[in] length length of the field
*/

static void parse_pk_with_prefix(std::vector<Table_map_log_event::
Optional_metadata_fields::uint_pair> &vec,
unsigned char *field, unsigned int length)
static void parse_pk_with_prefix(
Dynamic_array<Table_map_log_event::Optional_metadata_fields::uint_pair>
&vec,
unsigned char *field, unsigned int length)
{
unsigned char* p= field;

while (p < field + length)
{
unsigned int col_index= net_field_length(&p);
unsigned int col_prefix= net_field_length(&p);
vec.push_back(std::make_pair(col_index, col_prefix));
vec.append(std::make_pair(col_index, col_prefix));
}
}

Expand All @@ -3891,6 +3898,11 @@ Optional_metadata_fields(MEM_ROOT *root, uint master_columns,
uchar* optional_metadata,
size_t optional_metadata_len,
bool only_column_names)
: m_signedness(PSI_INSTRUMENT_MEM), m_column_charset(PSI_INSTRUMENT_MEM),
m_enum_and_set_column_charset(PSI_INSTRUMENT_MEM),
m_enum_str_value(PSI_INSTRUMENT_MEM),
m_set_str_value(PSI_INSTRUMENT_MEM), m_geometry_type(PSI_INSTRUMENT_MEM),
m_primary_key(PSI_INSTRUMENT_MEM)
{
unsigned int len;
uchar *metadata_end;
Expand Down
24 changes: 14 additions & 10 deletions sql/log_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

#include <my_bitmap.h>
#include "rpl_constants.h"
#include "sql_array.h"
#include <vector>
#include <string>
#include <functional>
Expand Down Expand Up @@ -4502,41 +4503,44 @@ class Table_map_log_event : public Log_event
struct Optional_metadata_fields
{
typedef std::pair<unsigned int, unsigned int> uint_pair;
typedef std::vector<std::string> str_vector;
typedef Dynamic_array<LEX_CSTRING> str_vector;
bool allocation_error; /* Set if allocation of data structures fails */

struct Default_charset
{
Default_charset() : default_charset(0) {}
Default_charset() : default_charset(0), charset_pairs(PSI_INSTRUMENT_MEM)
{
}
bool empty() const { return default_charset == 0; }

// Default charset for the columns which are not in charset_pairs.
unsigned int default_charset;

/* The uint_pair means <column index, column charset number>. */
std::vector<uint_pair> charset_pairs;
// std::vector<uint_pair> charset_pairs;
Dynamic_array<uint_pair> charset_pairs;
};

// Contents of DEFAULT_CHARSET field is converted into Default_charset.
Default_charset m_default_charset;
// Contents of ENUM_AND_SET_DEFAULT_CHARSET are converted into
// Default_charset.
Default_charset m_enum_and_set_default_charset;
std::vector<bool> m_signedness;
Dynamic_array<bool> m_signedness;
// Character set number of every string column
std::vector<unsigned int> m_column_charset;
Dynamic_array<uint> m_column_charset;
// Character set number of every ENUM or SET column.
std::vector<unsigned int> m_enum_and_set_column_charset;
Dynamic_array<uint> m_enum_and_set_column_charset;
LEX_CSTRING *m_column_name;
// each str_vector stores values of one enum/set column
std::vector<str_vector> m_enum_str_value;
std::vector<str_vector> m_set_str_value;
std::vector<unsigned int> m_geometry_type;
Dynamic_array<str_vector> m_enum_str_value;
Dynamic_array<str_vector> m_set_str_value;
Dynamic_array<uint> m_geometry_type;
/*
The uint_pair means <column index, prefix length>. Prefix length is 0 if
whole column value is used.
*/
std::vector<uint_pair> m_primary_key;
Dynamic_array<uint_pair> m_primary_key;

/*
It parses m_optional_metadata and populates into above variables.
Expand Down
53 changes: 25 additions & 28 deletions sql/log_event_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3230,7 +3230,7 @@ class Table_map_log_event::Charset_iterator
*/
static std::unique_ptr<Charset_iterator> create_charset_iterator(
const Default_charset &default_charset,
const std::vector<uint> &column_charset);
const Dynamic_array<uint> &column_charset);
};

/**
Expand All @@ -3240,9 +3240,8 @@ class Table_map_log_event::Default_charset_iterator : public Charset_iterator
{
public:
Default_charset_iterator(const Default_charset &default_charset)
: m_iterator(default_charset.charset_pairs.begin()),
m_end(default_charset.charset_pairs.end()),
m_column_index(0),
: m_iterator(default_charset.charset_pairs.front()),
m_end(default_charset.charset_pairs.end()), m_column_index(0),
m_default_charset_info(
get_charset(default_charset.default_charset, 0)) {}

Expand All @@ -3259,8 +3258,8 @@ class Table_map_log_event::Default_charset_iterator : public Charset_iterator
~Default_charset_iterator(){};

private:
std::vector<Optional_metadata_fields::uint_pair>::const_iterator m_iterator,
m_end;
const Optional_metadata_fields::uint_pair *m_iterator;
const Optional_metadata_fields::uint_pair *m_end;
uint m_column_index;
const CHARSET_INFO *m_default_charset_info;
};
Expand All @@ -3271,8 +3270,9 @@ class Table_map_log_event::Default_charset_iterator : public Charset_iterator
class Table_map_log_event::Column_charset_iterator : public Charset_iterator
{
public:
Column_charset_iterator(const std::vector<uint> &column_charset)
: m_iterator(column_charset.begin()), m_end(column_charset.end()) {}
Column_charset_iterator(const Dynamic_array<uint> &column_charset)
: m_iterator(column_charset.front()), m_end(column_charset.end())
{}

const CHARSET_INFO *next() override {
const CHARSET_INFO *ret = nullptr;
Expand All @@ -3285,15 +3285,15 @@ class Table_map_log_event::Column_charset_iterator : public Charset_iterator

~Column_charset_iterator(){};
private:
std::vector<uint>::const_iterator m_iterator;
std::vector<uint>::const_iterator m_end;
const uint *m_iterator;
const uint *m_end;
};
//Table_map_log_event::Column_charset_iterator::~Column_charset_iterator(){int a=8;a++; a--;};

std::unique_ptr<Table_map_log_event::Charset_iterator>
Table_map_log_event::Charset_iterator::create_charset_iterator(
const Default_charset &default_charset,
const std::vector<uint> &column_charset)
const Dynamic_array<uint> &column_charset)
{
if (!default_charset.empty())
return std::unique_ptr<Charset_iterator>(
Expand Down Expand Up @@ -3459,7 +3459,7 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
const Optional_metadata_fields &fields)
{
unsigned char* field_metadata_ptr= m_field_metadata;
std::vector<bool>::const_iterator signedness_it= fields.m_signedness.begin();
const bool *signedness_it= fields.m_signedness.front();

std::unique_ptr<Charset_iterator> charset_it =
Charset_iterator::create_charset_iterator(fields.m_default_charset,
Expand All @@ -3468,12 +3468,11 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
Charset_iterator::create_charset_iterator(
fields.m_enum_and_set_default_charset,
fields.m_enum_and_set_column_charset);
std::vector<Optional_metadata_fields::str_vector>::const_iterator
set_str_values_it= fields.m_set_str_value.begin();
std::vector<Optional_metadata_fields::str_vector>::const_iterator
enum_str_values_it= fields.m_enum_str_value.begin();
std::vector<unsigned int>::const_iterator geometry_type_it=
fields.m_geometry_type.begin();
const Optional_metadata_fields::str_vector *set_str_values_it=
fields.m_set_str_value.front();
const Optional_metadata_fields::str_vector *enum_str_values_it=
fields.m_enum_str_value.front();
const uint *geometry_type_it= fields.m_geometry_type.front();
LEX_CSTRING *col_names= fields.m_column_name;

uint geometry_type= 0;
Expand Down Expand Up @@ -3542,24 +3541,24 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
if (real_type == MYSQL_TYPE_ENUM &&
enum_str_values_it != fields.m_enum_str_value.end())
{
str_values= &(*enum_str_values_it);
str_values= enum_str_values_it;
enum_str_values_it++;
}
else if (real_type == MYSQL_TYPE_SET &&
set_str_values_it != fields.m_set_str_value.end())
{
str_values= &(*set_str_values_it);
str_values= set_str_values_it;
set_str_values_it++;
}

if (str_values != NULL)
{
const char *separator= "(";
for (Optional_metadata_fields::str_vector::const_iterator it=
str_values->begin(); it != str_values->end(); it++)
for (const LEX_CSTRING *it= str_values->front(); it != str_values->end();
it++)
{
my_b_printf(file, "%s", separator);
pretty_print_str(file, it->c_str(), it->size());
pretty_print_str(file, it->str, it->length);
separator= ",";
}
my_b_printf(file, ")");
Expand All @@ -3582,12 +3581,10 @@ void Table_map_log_event::print_primary_key
{
my_b_printf(file, "# Primary Key(");

std::vector<Optional_metadata_fields::uint_pair>::const_iterator it=
fields.m_primary_key.begin();

for (; it != fields.m_primary_key.end(); it++)
for (auto *it= fields.m_primary_key.front();
it != fields.m_primary_key.end(); it++)
{
if (it != fields.m_primary_key.begin())
if (it != fields.m_primary_key.front())
my_b_printf(file, ", ");

// Print column name or column index
Expand Down
6 changes: 4 additions & 2 deletions sql/sql_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ template <typename Element_type> class Bounds_checked_array
{}

void reset() { m_array= NULL; m_size= 0; }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please avoid space only changes.


void reset(Element_type *array_arg, size_t size_arg)
{
m_array= array_arg;
Expand Down Expand Up @@ -197,6 +197,8 @@ template <class Elem> class Dynamic_array

size_t size() const { return array.elements; }

bool empty() const { return array.elements == 0; }

const Elem *end() const
{
return back() + 1;
Expand Down Expand Up @@ -282,7 +284,7 @@ template <class Elem> class Dynamic_array
size_t old_size= elements();
if (reserve(new_size))
return true;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please avoid space only changes.


if (new_size > old_size)
{
set_dynamic(&array, (uchar*)&default_val, new_size - 1);
Expand Down