Skip to content

Commit 18a122c

Browse files
committed
MDEV-38144: update Optional_metadata_fields to use MariaDB types
Currently Optional_metadata_fields has many members that use classes from the C++ standard library, most notably the use of std::vector and std::string. These members have been updated to use existing MariaDB types instead.
1 parent d755574 commit 18a122c

4 files changed

Lines changed: 76 additions & 61 deletions

File tree

sql/log_event.cc

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818

1919
#include "mariadb.h"
20+
#include "mysql/psi/psi_base.h"
2021
#include "sql_priv.h"
2122
#include "handler.h"
2223
#ifndef MYSQL_CLIENT
@@ -3722,13 +3723,13 @@ Table_map_log_event::~Table_map_log_event()
37223723
@param[in] field SIGNEDNESS field in table_map_event.
37233724
@param[in] length length of the field
37243725
*/
3725-
static void parse_signedness(std::vector<bool> &vec,
3726+
static void parse_signedness(Dynamic_array<bool> &vec,
37263727
unsigned char *field, unsigned int length)
37273728
{
37283729
for (unsigned int i= 0; i < length; i++)
37293730
{
37303731
for (unsigned char c= 0x80; c != 0; c>>= 1)
3731-
vec.push_back(field[i] & c);
3732+
vec.append(field[i] & c);
37323733
}
37333734
}
37343735

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

3754-
default_charset.charset_pairs.push_back(std::make_pair(col_index,
3755-
col_charset));
3755+
default_charset.charset_pairs.append(std::make_pair(col_index,
3756+
col_charset));
37563757
}
37573758
}
37583759

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

37713772
while (p < field + length)
3772-
vec.push_back(net_field_length(&p));
3773+
vec.append(net_field_length(&p));
37733774
}
37743775

37753776
/**
@@ -3806,21 +3807,25 @@ static bool parse_column_name(MEM_ROOT *root, LEX_CSTRING *name,
38063807
@param[in] field COLUMN_NAME field in table_map_event.
38073808
@param[in] length length of the field
38083809
*/
3809-
static void parse_set_str_value(std::vector<Table_map_log_event::
3810-
Optional_metadata_fields::str_vector> &vec,
3811-
unsigned char *field, unsigned int length)
3810+
static void parse_set_str_value(
3811+
Dynamic_array<Table_map_log_event::Optional_metadata_fields::str_vector>
3812+
&vec,
3813+
unsigned char *field, unsigned int length)
38123814
{
38133815
unsigned char* p= field;
38143816

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

3819-
vec.push_back(std::vector<std::string>());
3821+
if (vec.reserve(vec.elements() + 1))
3822+
return;
3823+
vec.elements(vec.elements() + 1);
3824+
vec.back()->init(PSI_INSTRUMENT_MEM);
38203825
for (unsigned int i= 0; i < count; i++)
38213826
{
38223827
unsigned len1= net_field_length(&p);
3823-
vec.back().push_back(std::string(reinterpret_cast<char *>(p), len1));
3828+
vec.back()->append(LEX_CSTRING{reinterpret_cast<char *>(p), len1});
38243829
p+= len1;
38253830
}
38263831
}
@@ -3833,13 +3838,13 @@ static void parse_set_str_value(std::vector<Table_map_log_event::
38333838
@param[in] field GEOMETRY_TYPE field in table_map_event.
38343839
@param[in] length length of the field
38353840
*/
3836-
static void parse_geometry_type(std::vector<unsigned int> &vec,
3841+
static void parse_geometry_type(Dynamic_array<uint> &vec,
38373842
unsigned char *field, unsigned int length)
38383843
{
38393844
unsigned char* p= field;
38403845

38413846
while (p < field + length)
3842-
vec.push_back(net_field_length(&p));
3847+
vec.append(net_field_length(&p));
38433848
}
38443849

38453850
/**
@@ -3852,14 +3857,15 @@ static void parse_geometry_type(std::vector<unsigned int> &vec,
38523857
@param[in] field SIMPLE_PRIMARY_KEY field in table_map_event.
38533858
@param[in] length length of the field
38543859
*/
3855-
static void parse_simple_pk(std::vector<Table_map_log_event::
3856-
Optional_metadata_fields::uint_pair> &vec,
3857-
unsigned char *field, unsigned int length)
3860+
static void parse_simple_pk(
3861+
Dynamic_array<Table_map_log_event::Optional_metadata_fields::uint_pair>
3862+
&vec,
3863+
unsigned char *field, unsigned int length)
38583864
{
38593865
unsigned char* p= field;
38603866

38613867
while (p < field + length)
3862-
vec.push_back(std::make_pair(net_field_length(&p), 0));
3868+
vec.append(std::make_pair(net_field_length(&p), 0));
38633869
}
38643870

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

3875-
static void parse_pk_with_prefix(std::vector<Table_map_log_event::
3876-
Optional_metadata_fields::uint_pair> &vec,
3877-
unsigned char *field, unsigned int length)
3881+
static void parse_pk_with_prefix(
3882+
Dynamic_array<Table_map_log_event::Optional_metadata_fields::uint_pair>
3883+
&vec,
3884+
unsigned char *field, unsigned int length)
38783885
{
38793886
unsigned char* p= field;
38803887

38813888
while (p < field + length)
38823889
{
38833890
unsigned int col_index= net_field_length(&p);
38843891
unsigned int col_prefix= net_field_length(&p);
3885-
vec.push_back(std::make_pair(col_index, col_prefix));
3892+
vec.append(std::make_pair(col_index, col_prefix));
38863893
}
38873894
}
38883895

@@ -3891,6 +3898,11 @@ Optional_metadata_fields(MEM_ROOT *root, uint master_columns,
38913898
uchar* optional_metadata,
38923899
size_t optional_metadata_len,
38933900
bool only_column_names)
3901+
: m_signedness(PSI_INSTRUMENT_MEM), m_column_charset(PSI_INSTRUMENT_MEM),
3902+
m_enum_and_set_column_charset(PSI_INSTRUMENT_MEM),
3903+
m_enum_str_value(PSI_INSTRUMENT_MEM),
3904+
m_set_str_value(PSI_INSTRUMENT_MEM), m_geometry_type(PSI_INSTRUMENT_MEM),
3905+
m_primary_key(PSI_INSTRUMENT_MEM)
38943906
{
38953907
unsigned int len;
38963908
uchar *metadata_end;

sql/log_event.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#include <my_bitmap.h>
3333
#include "rpl_constants.h"
34+
#include "sql_array.h"
3435
#include <vector>
3536
#include <string>
3637
#include <functional>
@@ -4502,41 +4503,44 @@ class Table_map_log_event : public Log_event
45024503
struct Optional_metadata_fields
45034504
{
45044505
typedef std::pair<unsigned int, unsigned int> uint_pair;
4505-
typedef std::vector<std::string> str_vector;
4506+
typedef Dynamic_array<LEX_CSTRING> str_vector;
45064507
bool allocation_error; /* Set if allocation of data structures fails */
45074508

45084509
struct Default_charset
45094510
{
4510-
Default_charset() : default_charset(0) {}
4511+
Default_charset() : default_charset(0), charset_pairs(PSI_INSTRUMENT_MEM)
4512+
{
4513+
}
45114514
bool empty() const { return default_charset == 0; }
45124515

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

45164519
/* The uint_pair means <column index, column charset number>. */
4517-
std::vector<uint_pair> charset_pairs;
4520+
// std::vector<uint_pair> charset_pairs;
4521+
Dynamic_array<uint_pair> charset_pairs;
45184522
};
45194523

45204524
// Contents of DEFAULT_CHARSET field is converted into Default_charset.
45214525
Default_charset m_default_charset;
45224526
// Contents of ENUM_AND_SET_DEFAULT_CHARSET are converted into
45234527
// Default_charset.
45244528
Default_charset m_enum_and_set_default_charset;
4525-
std::vector<bool> m_signedness;
4529+
Dynamic_array<bool> m_signedness;
45264530
// Character set number of every string column
4527-
std::vector<unsigned int> m_column_charset;
4531+
Dynamic_array<uint> m_column_charset;
45284532
// Character set number of every ENUM or SET column.
4529-
std::vector<unsigned int> m_enum_and_set_column_charset;
4533+
Dynamic_array<uint> m_enum_and_set_column_charset;
45304534
LEX_CSTRING *m_column_name;
45314535
// each str_vector stores values of one enum/set column
4532-
std::vector<str_vector> m_enum_str_value;
4533-
std::vector<str_vector> m_set_str_value;
4534-
std::vector<unsigned int> m_geometry_type;
4536+
Dynamic_array<str_vector> m_enum_str_value;
4537+
Dynamic_array<str_vector> m_set_str_value;
4538+
Dynamic_array<uint> m_geometry_type;
45354539
/*
45364540
The uint_pair means <column index, prefix length>. Prefix length is 0 if
45374541
whole column value is used.
45384542
*/
4539-
std::vector<uint_pair> m_primary_key;
4543+
Dynamic_array<uint_pair> m_primary_key;
45404544

45414545
/*
45424546
It parses m_optional_metadata and populates into above variables.

sql/log_event_client.cc

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3230,7 +3230,7 @@ class Table_map_log_event::Charset_iterator
32303230
*/
32313231
static std::unique_ptr<Charset_iterator> create_charset_iterator(
32323232
const Default_charset &default_charset,
3233-
const std::vector<uint> &column_charset);
3233+
const Dynamic_array<uint> &column_charset);
32343234
};
32353235

32363236
/**
@@ -3240,9 +3240,8 @@ class Table_map_log_event::Default_charset_iterator : public Charset_iterator
32403240
{
32413241
public:
32423242
Default_charset_iterator(const Default_charset &default_charset)
3243-
: m_iterator(default_charset.charset_pairs.begin()),
3244-
m_end(default_charset.charset_pairs.end()),
3245-
m_column_index(0),
3243+
: m_iterator(default_charset.charset_pairs.front()),
3244+
m_end(default_charset.charset_pairs.end()), m_column_index(0),
32463245
m_default_charset_info(
32473246
get_charset(default_charset.default_charset, 0)) {}
32483247

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

32613260
private:
3262-
std::vector<Optional_metadata_fields::uint_pair>::const_iterator m_iterator,
3263-
m_end;
3261+
const Optional_metadata_fields::uint_pair *m_iterator;
3262+
const Optional_metadata_fields::uint_pair *m_end;
32643263
uint m_column_index;
32653264
const CHARSET_INFO *m_default_charset_info;
32663265
};
@@ -3271,8 +3270,9 @@ class Table_map_log_event::Default_charset_iterator : public Charset_iterator
32713270
class Table_map_log_event::Column_charset_iterator : public Charset_iterator
32723271
{
32733272
public:
3274-
Column_charset_iterator(const std::vector<uint> &column_charset)
3275-
: m_iterator(column_charset.begin()), m_end(column_charset.end()) {}
3273+
Column_charset_iterator(const Dynamic_array<uint> &column_charset)
3274+
: m_iterator(column_charset.front()), m_end(column_charset.end())
3275+
{}
32763276

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

32863286
~Column_charset_iterator(){};
32873287
private:
3288-
std::vector<uint>::const_iterator m_iterator;
3289-
std::vector<uint>::const_iterator m_end;
3288+
const uint *m_iterator;
3289+
const uint *m_end;
32903290
};
32913291
//Table_map_log_event::Column_charset_iterator::~Column_charset_iterator(){int a=8;a++; a--;};
32923292

32933293
std::unique_ptr<Table_map_log_event::Charset_iterator>
32943294
Table_map_log_event::Charset_iterator::create_charset_iterator(
32953295
const Default_charset &default_charset,
3296-
const std::vector<uint> &column_charset)
3296+
const Dynamic_array<uint> &column_charset)
32973297
{
32983298
if (!default_charset.empty())
32993299
return std::unique_ptr<Charset_iterator>(
@@ -3459,7 +3459,7 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
34593459
const Optional_metadata_fields &fields)
34603460
{
34613461
unsigned char* field_metadata_ptr= m_field_metadata;
3462-
std::vector<bool>::const_iterator signedness_it= fields.m_signedness.begin();
3462+
const bool *signedness_it= fields.m_signedness.front();
34633463

34643464
std::unique_ptr<Charset_iterator> charset_it =
34653465
Charset_iterator::create_charset_iterator(fields.m_default_charset,
@@ -3468,12 +3468,11 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
34683468
Charset_iterator::create_charset_iterator(
34693469
fields.m_enum_and_set_default_charset,
34703470
fields.m_enum_and_set_column_charset);
3471-
std::vector<Optional_metadata_fields::str_vector>::const_iterator
3472-
set_str_values_it= fields.m_set_str_value.begin();
3473-
std::vector<Optional_metadata_fields::str_vector>::const_iterator
3474-
enum_str_values_it= fields.m_enum_str_value.begin();
3475-
std::vector<unsigned int>::const_iterator geometry_type_it=
3476-
fields.m_geometry_type.begin();
3471+
const Optional_metadata_fields::str_vector *set_str_values_it=
3472+
fields.m_set_str_value.front();
3473+
const Optional_metadata_fields::str_vector *enum_str_values_it=
3474+
fields.m_enum_str_value.front();
3475+
const uint *geometry_type_it= fields.m_geometry_type.front();
34773476
LEX_CSTRING *col_names= fields.m_column_name;
34783477

34793478
uint geometry_type= 0;
@@ -3542,24 +3541,24 @@ void Table_map_log_event::print_columns(IO_CACHE *file,
35423541
if (real_type == MYSQL_TYPE_ENUM &&
35433542
enum_str_values_it != fields.m_enum_str_value.end())
35443543
{
3545-
str_values= &(*enum_str_values_it);
3544+
str_values= enum_str_values_it;
35463545
enum_str_values_it++;
35473546
}
35483547
else if (real_type == MYSQL_TYPE_SET &&
35493548
set_str_values_it != fields.m_set_str_value.end())
35503549
{
3551-
str_values= &(*set_str_values_it);
3550+
str_values= set_str_values_it;
35523551
set_str_values_it++;
35533552
}
35543553

35553554
if (str_values != NULL)
35563555
{
35573556
const char *separator= "(";
3558-
for (Optional_metadata_fields::str_vector::const_iterator it=
3559-
str_values->begin(); it != str_values->end(); it++)
3557+
for (const LEX_CSTRING *it= str_values->front(); it != str_values->end();
3558+
it++)
35603559
{
35613560
my_b_printf(file, "%s", separator);
3562-
pretty_print_str(file, it->c_str(), it->size());
3561+
pretty_print_str(file, it->str, it->length);
35633562
separator= ",";
35643563
}
35653564
my_b_printf(file, ")");
@@ -3582,12 +3581,10 @@ void Table_map_log_event::print_primary_key
35823581
{
35833582
my_b_printf(file, "# Primary Key(");
35843583

3585-
std::vector<Optional_metadata_fields::uint_pair>::const_iterator it=
3586-
fields.m_primary_key.begin();
3587-
3588-
for (; it != fields.m_primary_key.end(); it++)
3584+
for (auto *it= fields.m_primary_key.front();
3585+
it != fields.m_primary_key.end(); it++)
35893586
{
3590-
if (it != fields.m_primary_key.begin())
3587+
if (it != fields.m_primary_key.front())
35913588
my_b_printf(file, ", ");
35923589

35933590
// Print column name or column index

sql/sql_array.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ template <typename Element_type> class Bounds_checked_array
4242
{}
4343

4444
void reset() { m_array= NULL; m_size= 0; }
45-
45+
4646
void reset(Element_type *array_arg, size_t size_arg)
4747
{
4848
m_array= array_arg;
@@ -197,6 +197,8 @@ template <class Elem> class Dynamic_array
197197

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

200+
bool empty() const { return array.elements == 0; }
201+
200202
const Elem *end() const
201203
{
202204
return back() + 1;
@@ -282,7 +284,7 @@ template <class Elem> class Dynamic_array
282284
size_t old_size= elements();
283285
if (reserve(new_size))
284286
return true;
285-
287+
286288
if (new_size > old_size)
287289
{
288290
set_dynamic(&array, (uchar*)&default_val, new_size - 1);

0 commit comments

Comments
 (0)