From 677133f1b3d45dcf72484a2cc9577ad09d8a78fd Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 26 Jun 2019 05:29:44 +0400 Subject: MDEV-19863 Add const to TYPELIB pointers --- sql/field.cc | 28 +++++++++++++++------------- sql/field.h | 14 +++++++------- sql/item.h | 12 ++++++------ sql/item_sum.h | 2 +- sql/sql_class.h | 6 +++--- sql/sql_table.cc | 2 +- sql/sql_type.cc | 8 ++++---- sql/sql_type.h | 4 ++-- sql/strfunc.cc | 3 ++- sql/strfunc.h | 3 ++- sql/table.cc | 2 +- sql/unireg.cc | 21 +++++++++++---------- 12 files changed, 55 insertions(+), 50 deletions(-) (limited to 'sql') diff --git a/sql/field.cc b/sql/field.cc index 3cff08d1e7c..871baa317f8 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -9462,7 +9462,8 @@ bool Field::eq_def(const Field *field) const @return TRUE if the type names of t1 match those of t2. FALSE otherwise. */ -static bool compare_type_names(CHARSET_INFO *charset, TYPELIB *t1, TYPELIB *t2) +static bool compare_type_names(CHARSET_INFO *charset, const TYPELIB *t1, + const TYPELIB *t2) { for (uint i= 0; i < t1->count; i++) if (my_strnncoll(charset, @@ -9481,7 +9482,7 @@ static bool compare_type_names(CHARSET_INFO *charset, TYPELIB *t1, TYPELIB *t2) bool Field_enum::eq_def(const Field *field) const { - TYPELIB *values; + const TYPELIB *values; if (!Field::eq_def(field)) return FALSE; @@ -9507,7 +9508,7 @@ bool Field_enum::eq_def(const Field *field) const uint Field_enum::is_equal(Create_field *new_field) { - TYPELIB *values= new_field->interval; + const TYPELIB *values= new_field->interval; /* The fields are compatible if they have the same flags, @@ -10240,7 +10241,8 @@ bool Column_definition::create_interval_from_interval_list(MEM_ROOT *mem_root, { DBUG_ENTER("Column_definition::create_interval_from_interval_list"); DBUG_ASSERT(!interval); - if (!(interval= (TYPELIB*) alloc_root(mem_root, sizeof(TYPELIB)))) + TYPELIB *tmpint; + if (!(interval= tmpint= (TYPELIB*) alloc_root(mem_root, sizeof(TYPELIB)))) DBUG_RETURN(true); // EOM List_iterator it(interval_list); @@ -10254,17 +10256,17 @@ bool Column_definition::create_interval_from_interval_list(MEM_ROOT *mem_root, DBUG_ASSERT(comma_length >= 0 && comma_length <= (int) sizeof(comma_buf)); if (!multi_alloc_root(mem_root, - &interval->type_names, + &tmpint->type_names, sizeof(char*) * (interval_list.elements + 1), - &interval->type_lengths, + &tmpint->type_lengths, sizeof(uint) * (interval_list.elements + 1), NullS)) goto err; // EOM - interval->name= ""; - interval->count= interval_list.elements; + tmpint->name= ""; + tmpint->count= interval_list.elements; - for (uint i= 0; i < interval->count; i++) + for (uint i= 0; i < interval_list.elements; i++) { uint32 dummy; String *tmp= it++; @@ -10302,11 +10304,11 @@ bool Column_definition::create_interval_from_interval_list(MEM_ROOT *mem_root, goto err; } } - interval->type_names[i]= value.str; - interval->type_lengths[i]= (uint)value.length; + tmpint->type_names[i]= value.str; + tmpint->type_lengths[i]= (uint)value.length; } - interval->type_names[interval->count]= 0; // End marker - interval->type_lengths[interval->count]= 0; + tmpint->type_names[interval_list.elements]= 0; // End marker + tmpint->type_lengths[interval_list.elements]= 0; interval_list.empty(); // Don't need interval_list anymore DBUG_RETURN(false); err: diff --git a/sql/field.h b/sql/field.h index aaa322fdd11..a030987f21f 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1430,7 +1430,7 @@ public: void copy_from_tmp(int offset); uint fill_cache_field(struct st_cache_field *copy); virtual bool get_date(MYSQL_TIME *ltime, date_mode_t fuzzydate); - virtual TYPELIB *get_typelib() const { return NULL; } + virtual const TYPELIB *get_typelib() const { return NULL; } virtual CHARSET_INFO *charset(void) const { return &my_charset_bin; } virtual CHARSET_INFO *charset_for_protocol(void) const { return binary() ? &my_charset_bin : charset(); } @@ -4313,12 +4313,12 @@ class Field_enum :public Field_str { protected: uint packlength; public: - TYPELIB *typelib; + const TYPELIB *typelib; Field_enum(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, uint packlength_arg, - TYPELIB *typelib_arg, + const TYPELIB *typelib_arg, const DTCollation &collation) :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, collation), @@ -4391,7 +4391,7 @@ public: /* enum and set are sorted as integers */ CHARSET_INFO *sort_charset(void) const { return &my_charset_bin; } uint decimals() const { return 0; } - TYPELIB *get_typelib() const { return typelib; } + const TYPELIB *get_typelib() const { return typelib; } virtual uchar *pack(uchar *to, const uchar *from, uint max_length); virtual const uchar *unpack(uchar *to, const uchar *from, @@ -4426,7 +4426,7 @@ public: uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, uint32 packlength_arg, - TYPELIB *typelib_arg, const DTCollation &collation) + const TYPELIB *typelib_arg, const DTCollation &collation) :Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, packlength_arg, @@ -4687,7 +4687,7 @@ public: */ ulonglong length; Field::utype unireg_check; - TYPELIB *interval; // Which interval to use + const TYPELIB *interval; // Which interval to use CHARSET_INFO *charset; uint32 srid; Field::geometry_type geom_type; @@ -5170,7 +5170,7 @@ public: LEX_CSTRING change; // If done with alter table LEX_CSTRING after; // Put column after this one Field *field; // For alter table - TYPELIB *save_interval; // Temporary copy for the above + const TYPELIB *save_interval; // Temporary copy for the above // Used only for UCS2 intervals /** structure with parsed options (for comparing fields in ALTER TABLE) */ diff --git a/sql/item.h b/sql/item.h index 3b889b08e7c..c556b851b03 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1114,9 +1114,9 @@ public: { return type_handler()->max_display_length(this); } - TYPELIB *get_typelib() const { return NULL; } + const TYPELIB *get_typelib() const { return NULL; } void set_maybe_null(bool maybe_null_arg) { maybe_null= maybe_null_arg; } - void set_typelib(TYPELIB *typelib) + void set_typelib(const TYPELIB *typelib) { // Non-field Items (e.g. hybrid functions) never have ENUM/SET types yet. DBUG_ASSERT(0); @@ -3352,7 +3352,7 @@ public: const Tmp_field_param *param); Field *create_tmp_field_ex(TABLE *table, Tmp_field_src *src, const Tmp_field_param *param); - TYPELIB *get_typelib() const { return field->get_typelib(); } + const TYPELIB *get_typelib() const { return field->get_typelib(); } enum_monotonicity_info get_monotonicity_info() const { return MONOTONIC_STRICT_INCREASING; @@ -5213,7 +5213,7 @@ public: { return ref ? (*ref)->real_item() : this; } - TYPELIB *get_typelib() const + const TYPELIB *get_typelib() const { return ref ? (*ref)->get_typelib() : NULL; } @@ -6962,7 +6962,7 @@ class Item_type_holder: public Item, public Type_geometry_attributes { protected: - TYPELIB *enum_set_typelib; + const TYPELIB *enum_set_typelib; public: Item_type_holder(THD *thd, Item *item) :Item(thd, item), @@ -6998,7 +6998,7 @@ public: } enum Type type() const { return TYPE_HOLDER; } - TYPELIB *get_typelib() const { return enum_set_typelib; } + const TYPELIB *get_typelib() const { return enum_set_typelib; } double val_real(); longlong val_int(); my_decimal *val_decimal(my_decimal *); diff --git a/sql/item_sum.h b/sql/item_sum.h index 59b8f824c72..dbcb617ce51 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -1090,7 +1090,7 @@ protected: } const Type_handler *type_handler() const { return Type_handler_hybrid_field_type::type_handler(); } - TYPELIB *get_typelib() const { return args[0]->get_typelib(); } + const TYPELIB *get_typelib() const { return args[0]->get_typelib(); } void update_field(); void min_max_update_str_field(); void min_max_update_real_field(); diff --git a/sql/sql_class.h b/sql/sql_class.h index 63f964e96ce..63c53c3332e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -6832,7 +6832,7 @@ class Type_holder: public Sql_alloc, public Type_all_attributes, public Type_geometry_attributes { - TYPELIB *m_typelib; + const TYPELIB *m_typelib; bool m_maybe_null; public: Type_holder() @@ -6863,11 +6863,11 @@ public: { return Type_geometry_attributes::get_geometry_type(); } - void set_typelib(TYPELIB *typelib) + void set_typelib(const TYPELIB *typelib) { m_typelib= typelib; } - TYPELIB *get_typelib() const + const TYPELIB *get_typelib() const { return m_typelib; } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 28c0f015c82..f92d55bc88b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -2846,7 +2846,7 @@ static int sort_keys(KEY *a, KEY *b) */ bool check_duplicates_in_interval(const char *set_or_name, - const char *name, TYPELIB *typelib, + const char *name, const TYPELIB *typelib, CHARSET_INFO *cs, unsigned int *dup_val_count) { TYPELIB tmp= *typelib; diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 33096a193d3..3265461ae24 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -3402,7 +3402,7 @@ Field *Type_handler_enum::make_table_field(const LEX_CSTRING *name, const Type_all_attributes &attr, TABLE *table) const { - TYPELIB *typelib= attr.get_typelib(); + const TYPELIB *typelib= attr.get_typelib(); DBUG_ASSERT(typelib); return new (table->in_use->mem_root) Field_enum(addr.ptr(), attr.max_length, @@ -3419,7 +3419,7 @@ Field *Type_handler_set::make_table_field(const LEX_CSTRING *name, TABLE *table) const { - TYPELIB *typelib= attr.get_typelib(); + const TYPELIB *typelib= attr.get_typelib(); DBUG_ASSERT(typelib); return new (table->in_use->mem_root) Field_set(addr.ptr(), attr.max_length, @@ -4091,10 +4091,10 @@ bool Type_handler_typelib:: Type_all_attributes *func, Item **items, uint nitems) const { - TYPELIB *typelib= NULL; + const TYPELIB *typelib= NULL; for (uint i= 0; i < nitems; i++) { - TYPELIB *typelib2; + const TYPELIB *typelib2; if ((typelib2= items[i]->get_typelib())) { if (typelib) diff --git a/sql/sql_type.h b/sql/sql_type.h index 691945383a8..776422081c8 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -2971,8 +2971,8 @@ public: */ virtual uint uint_geometry_type() const= 0; virtual void set_geometry_type(uint type)= 0; - virtual TYPELIB *get_typelib() const= 0; - virtual void set_typelib(TYPELIB *typelib)= 0; + virtual const TYPELIB *get_typelib() const= 0; + virtual void set_typelib(const TYPELIB *typelib)= 0; }; diff --git a/sql/strfunc.cc b/sql/strfunc.cc index 99ff9c50588..61f6078c875 100644 --- a/sql/strfunc.cc +++ b/sql/strfunc.cc @@ -45,7 +45,8 @@ static const char field_separator=','; -ulonglong find_set(TYPELIB *lib, const char *str, size_t length, CHARSET_INFO *cs, +ulonglong find_set(const TYPELIB *lib, + const char *str, size_t length, CHARSET_INFO *cs, char **err_pos, uint *err_len, bool *set_warning) { CHARSET_INFO *strip= cs ? cs : &my_charset_latin1; diff --git a/sql/strfunc.h b/sql/strfunc.h index d66d4c63444..b2b293e153f 100644 --- a/sql/strfunc.h +++ b/sql/strfunc.h @@ -18,7 +18,8 @@ typedef struct st_typelib TYPELIB; -ulonglong find_set(TYPELIB *lib, const char *x, size_t length, CHARSET_INFO *cs, +ulonglong find_set(const TYPELIB *lib, + const char *x, size_t length, CHARSET_INFO *cs, char **err_pos, uint *err_len, bool *set_warning); ulonglong find_set_from_flags(TYPELIB *lib, uint default_name, ulonglong cur_set, ulonglong default_set, diff --git a/sql/table.cc b/sql/table.cc index 17a9e2048d0..91b40a159b3 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -9372,7 +9372,7 @@ bool TR_table::check(bool error) } Field_enum *iso_level= static_cast(table->field[FLD_ISO_LEVEL]); - st_typelib *typelib= iso_level->typelib; + const st_typelib *typelib= iso_level->typelib; if (typelib->count != 4) goto wrong_enum; diff --git a/sql/unireg.cc b/sql/unireg.cc index d019b5f8a75..a3dcf69d2f2 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -722,6 +722,7 @@ static bool pack_header(THD *thd, uchar *forminfo, if (field->charset->mbminlen > 1) { + TYPELIB *tmpint; /* Escape UCS2 intervals using HEX notation to avoid problems with delimiters between enum elements. @@ -731,15 +732,16 @@ static bool pack_header(THD *thd, uchar *forminfo, The HEX representation is created from this copy. */ field->save_interval= field->interval; - field->interval= (TYPELIB*) thd->alloc(sizeof(TYPELIB)); - *field->interval= *field->save_interval; - field->interval->type_names= + field->interval= tmpint= (TYPELIB*) thd->alloc(sizeof(TYPELIB)); + *tmpint= *field->save_interval; + tmpint->type_names= (const char **) thd->alloc(sizeof(char*) * (field->interval->count+1)); - field->interval->type_names[field->interval->count]= 0; - field->interval->type_lengths= + tmpint->type_lengths= (uint *) thd->alloc(sizeof(uint) * field->interval->count); - + tmpint->type_names[field->interval->count]= 0; + tmpint->type_lengths[field->interval->count]= 0; + for (uint pos= 0; pos < field->interval->count; pos++) { char *dst; @@ -747,9 +749,8 @@ static bool pack_header(THD *thd, uchar *forminfo, size_t hex_length; length= field->save_interval->type_lengths[pos]; hex_length= length * 2; - field->interval->type_lengths[pos]= (uint)hex_length; - field->interval->type_names[pos]= dst= - (char*) thd->alloc(hex_length + 1); + tmpint->type_lengths[pos]= (uint) hex_length; + tmpint->type_names[pos]= dst= (char*) thd->alloc(hex_length + 1); octet2hex(dst, src, length); } } @@ -813,7 +814,7 @@ static uint get_interval_id(uint *int_count,List &create_fields, { List_iterator it(create_fields); Create_field *field; - TYPELIB *interval=last_field->interval; + const TYPELIB *interval= last_field->interval; while ((field=it++) != last_field) { -- cgit v1.2.1